From 7af14ca10b12913f23efcb22cf64b37601e7632e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Mon, 2 Oct 2023 23:57:52 +0200 Subject: [PATCH 01/25] Manifestv2 --- check_process | 34 --- conf/app.src | 7 - conf/nginx.conf | 4 +- conf/php-fpm.conf | 3 +- docs/screenshots/DESCRIPTION_fr.md | 16 ++ docs/screenshots/digiscreen.jpg | Bin 0 -> 175464 bytes manifest.json | 83 ------ manifest.toml | 89 +++++++ scripts/_common.sh | 15 +- scripts/backup | 49 +--- scripts/change_url | 66 ++--- scripts/install | 394 +---------------------------- scripts/remove | 56 ---- scripts/restore | 89 +------ scripts/upgrade | 162 ++---------- tests.toml | 7 + 16 files changed, 203 insertions(+), 871 deletions(-) delete mode 100644 check_process delete mode 100644 conf/app.src create mode 100644 docs/screenshots/DESCRIPTION_fr.md create mode 100644 docs/screenshots/digiscreen.jpg delete mode 100644 manifest.json create mode 100644 manifest.toml create mode 100644 tests.toml diff --git a/check_process b/check_process deleted file mode 100644 index 8cae27c..0000000 --- a/check_process +++ /dev/null @@ -1,34 +0,0 @@ -# See here for more information -# https://github.com/YunoHost/package_check#syntax-check_process-file - -# Move this file from check_process.default to check_process when you have filled it. - -;; Test complet - ; Manifest - domain="domain.tld" - path="/path" - # admin="john" - language="fr" - is_public=1 - # password="1Strong-Password" - # port="666" - ; Checks - pkg_linter=1 - setup_sub_dir=1 - setup_root=1 - setup_nourl=0 - setup_private=1 - setup_public=1 - upgrade=1 - upgrade=1 from_commit=3bb42cd71bcca77b7f642859bf5048317586a500 - backup_restore=1 - multi_instance=1 - port_already_use=0 - change_url=1 -;;; Options -Email= -Notification=none -;;; Upgrade options - ; commit=3bb42cd71bcca77b7f642859bf5048317586a500 - ;name=First release. - ;manifest_arg=domain=DOMAIN&path=PATH&language=fr&is_public=1& diff --git a/conf/app.src b/conf/app.src deleted file mode 100644 index 52bbfa6..0000000 --- a/conf/app.src +++ /dev/null @@ -1,7 +0,0 @@ -SOURCE_URL=https://github.com/YunoHost-Apps/digiscreen_ynh/releases/download/0.6.4/digiscreen-0.6.4.zip -SOURCE_SUM=92273e360e06639283ee9db746d1d53006af7ea405f1ecbe85a262b39eae6756 -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=zip -SOURCE_IN_SUBDIR=true -#SOURCE_FILENAME= -SOURCE_EXTRACT=true diff --git a/conf/nginx.conf b/conf/nginx.conf index 4ac1997..7104a76 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,7 +2,7 @@ location __PATH__/ { # Path to source - alias __FINALPATH__/ ; + alias __INSTALL_DIR__/www/; ### Example PHP configuration (remove it if not used) index index.html index.php; @@ -25,4 +25,4 @@ location __PATH__/ { # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; -} +} diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 230b4ea..c487766 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -358,7 +358,7 @@ request_terminate_timeout = 1d ; Chdir to this directory at the start. ; Note: relative path can be used. ; Default Value: current directory or / when chroot -chdir = __FINALPATH__ +chdir = __INSTALL_DIR__/www ; Redirect worker stdout and stderr into main error log. If not set, stdout and ; stderr will be redirected to /dev/null according to FastCGI specs. @@ -428,4 +428,3 @@ chdir = __FINALPATH__ ; php_admin_value[max_input_time] = 300 ; php_admin_value[memory_limit] = 256M ; php_admin_flag[short_open_tag] = On - diff --git a/docs/screenshots/DESCRIPTION_fr.md b/docs/screenshots/DESCRIPTION_fr.md new file mode 100644 index 0000000..d93571c --- /dev/null +++ b/docs/screenshots/DESCRIPTION_fr.md @@ -0,0 +1,16 @@ +Digiscreen est un fond d'écran interactif pour la salle de classe en présence ou à distance. + +Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation de leurs cours, Digiscreen propose un ensemble d'outils pratiques sous forme de modules : + +* générateur de codes QR ; +* affichage de textes, d'images et de fichiers audio en ligne ; +* dessin ; +* diffusion et découpage de vidéos YouTube ; +* chronomètre et compte à rebours ; +* générateur de nuages de mots ; +* synthèse vocale ; +* exercices interactifs : remise en ordre et texte à trous ; +* contenus intégrés : sites Web, documents en ligne et contenus interactifs (LearningApps par exemple) ; +* capture d'écran ; +* annotation ; +* et d'autres à venir 🙂. diff --git a/docs/screenshots/digiscreen.jpg b/docs/screenshots/digiscreen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed2851b17f5a97ff04281f1005ce4013fd39bfe9 GIT binary patch literal 175464 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ϖFlZdPB4DoGSxZWfWmwF z)jp$W#P5%OQzXJZZX(rcvTsXxYF!*;D{gELJ*`c3#T}o!>?QW4*irT^D35S=t_Bw8 z&bS}C9OYtkZmt`tjqW^^cqWLw@2=g|+}gBGy6j_@`^~q^67OG=$1%EBwS#KYsl*+cHkBJ@B<)#p3#Q!)u2+#&c*+81&#AWM31H z`^D%xAw@V75%T}KT>d3YbnIxAsr8BQe`td`{?MPE^e`Tj3uK1QBKlH?{%@=E@AVp! z`6($~ksvo-?j!i4W~)0mgv$@T%~v$?k@wBO{{_errD&SVvU5ev|e-aZ{`0BVfp#qsMm9p?Htr6oU%%bA3nTOSwTE&=G1+ApmX_8`v`d;NT%SQ zkAEsWL4$Y-aUe6nmjxPnwJHxkA5AL73O;JTkI9h!n0r-JyhCNwqciTDPd=#ye=ASIKbcmvZ;s36Z1@MrsL8SU z)OSL_F2vg!7EZ%#w`A0WJ9{&(;H7E>kWJYaw+o>_pqEyy5XK8o*utPZ!ES^+Go7=dbvqfk~Irig2L3 zA*caYy;Fr;Knd$W#pu$`B}8rQunD(VY~*e1e}F}6Uxq9`NDwlSE&lQ_|0549)|PFa z#C3q-&NznUABDFnF?(wIg+l#E+_2z$x{t{UxaP41x6-$gaY2Qaoit7!gqv_+0;)%n zSNHpV9m9v^>q$`Ke+m_V$-L4@D1THz{+uNS@o#?F1G*?6 zfuu73r9T9a;TK^aJpU1_Uexv62t8o9`RAFJp~4i&0$|`j9Mn-6L&N+AWwO*UfB}D0 zF@8iNW+bUVE>68}UcUPciok=L?MQ{_*O@|zXk z3IOd#bUbj^)WKO_ggH-93pc77>kaJbhkva?dai*@h-KQ_8e@2bj!hBXzL1X1KTsT7 zDi9CsH$aX#edx<-C~`i&?i9oLk19IU@*JywQS~aiK@L~Lju&_?WlI_!f8%5OM;`sb zL~dgvb50dyXe2D3R;vzSc264rQ|=C@JHf?lc2Xx70eyN zD0n!&)tz+)?E9`EF6gZ9c>V&W+)HB({EhmTDtIYhRuqM`rlyw}P3 zL*Re9;YsJroM;58O@YYyk9}300mY%kc;}Kc$>~vSlQQ1U)~a$cp$f=3eIMUD*9i~& z1H5f1P7Ij%I;^Og$3S_o<*`y~V8iiG6?is`6ku=UQp>vn@Zz&6O5=MO8Q zKU6U)e@ao?V_ubCFzbjrJN-(Y9Joe0QCnzyh0%6N^R*ZWi+nLtV!-jk%b}1-hsQq< ziUN2U9O`RP5@YU086sa6`T3be01<H!LEXPE4s2U#b1xz2fe}r+MV?H8fR$D|ZY`ddF<=EE9gM(vfF|IKmnJ z>tNRW{?=|Q65IVdfowTJnDX^c#%=m+t7H4e+(Za`;@$yQ`pXIXL_kI)AT=$YlD~oS z4DxlRWfpc`xy9jd_sycuY16R%mQQCa|1WdUjn3w@3?y>&O6ZmNe%xL^& zS83cvj)JlOR>6l?+{J#Zkv$3O#RONbB9mNU;iAA&vsO?u@LH3$;BO#<1e)-D>P2Vz z4}(jTsVr^63;CjCJ0NHvDEs@L0V)7>izCG3w`xno2qpdO|1-cM4H3MGxu zrIPu~fTN>%NjE|%rhfQ^hF(>HS=D34{+xXF>lL%)B6ukVC-QP5t<6i9o2VE*0Vi@tCwfqP?)AkIuLc% zZ~zEm+x&Y(a3%kJuq0;zR6;{lSsk0#T_ev_M9Hy=o>uts1`y|!cocvdaP0r9{XZWG zvd1~{wx5n(202FsPw=iS2L1*#K^NFT81P3EyZ-~|FEow9AWX`Y6Me#IJS_l0T2JE|6eL!z&Kjq1%TCa?6vGHet9vINGluo75U!4K2JsD|H$)?q8<+} z&f6iLNzwMZ8(?Q4_vEw#^w;6_gI%((%l|&Qe|1kr_=&iyN*dC5;@sKHk0ZKcRO_Yr-9YedR2_`P=1tbDzt$W#+tX%i$D?o)+V5UMYi@hmryO7p64Lol<@sjykqeuPKGG`|=ZwtX50)Swk@seR#r?kRsb98OeUj z@>K0&wzc(@V*k4te`6?YD;T0@XZ7`Fj8|B2=sfHARQp6lO;n;6@pvHfC9WobxbbP&Q@3zHP=<-!WvEylSDcn}0z9BUzya z%T9IP+J(Rhx&r@k%_G8&K*~+Opj~#A1nf<|b|HH3Jb4qWWyxF)e^Lz*ARr*XUo;{h zBBLU~Yk#F0!l&n!q|@M%Fmn!0%B`9>Rqt3cJ^L%w5WI;veuBBJ8&ehYs4x`9KlIw+ z^kYJ?%RVdZP@Ka$$z5X($yxZSl3z^cN$>HTM(TK|8`z zrLz}wd8A8py34v!sa)j!7&w{X@kro4(5$;Tn}r6hlhfGv>0DijogM|pS*Hm9QW?i6 zy1|f+rWb`d-Dc{1^K6yn8@{Dx={=kX11c;r_In!M+aYw`A8UlZf-a8u*9_e7#m~s1 z^Tzpt&6EPE0L_w9`3_AObVeiwfgx0z&sQ@$V5H00f0fq2AmWHeNN?lip7+>jhwS%b zBObV|RvPQ^>?Zo-8CvejzKTd~CS3R>9jSf_k!CzjDcBcP5?d!k#fcDtdMbQ0#kih8 zIt)&QO1xRdh8C5+^bA_f=p3mMj3GZT-8U)J^Ir#U8Z2&x#ig3lxI`v9R5uZo>`w&M zSa=n}`Yb5gq1K*08y0(l#7#=;v%1|29YMXXZ!xeEI2f@_AaD?>eSD!pwH<3!idPyJ25LOSRds1FM}4+Y5+ ze0|+EX_8Ri5Se<~An-3^*zEVuGyM<<)$@{vfi^?i8Qq+aMPazY9!U=IqDn+R1i1F7 zDp!Z&(Wpc$8+@Is@NYqsUIQs6aBm~KZjm87t0fp~MRH{Q700rY!;hV!XT9i0OV_52 zpN-58m~b*340^kzVWde*pJ#{iMDggU z8fpg0s*aylH#DO*9&}qFh8*+mt84eFw?rq&5N_5L zFtZSs_N=VD@>okES~RoxTDp|MEE5UEVll;M)>C8o^h_GsKJd}5KEkW3c#XkHIm2A< z$|CBbxlOV-!EmXm*J(hkCc!h>YH1^Q6*!OYJc`2@C4ArxV{mC4IH3|-#b#_hPPPtNUJ9|9 zY;k$)=3g2d^z4AYcjmo?9Bv)#din-gwp@MebXpb*hDD=G$MP$^8A&fq5~)qdfgC}o z)%>s^MAt*qy&LxHhZ{9$6sBw^+Ir177%3wWG_uupp8ZZ<)yZsj4x1|uskt*nLh+!Z zWVTx0#YPBAH$)F#^{a~LJ(?lE@f$2V3}bi>_rv7f{Xx&&W~tPR5Kp^(F?m7@;eNLv zh*^SQvpsZkDia~-)6V7t9om~p^){h`?J4K9BT=aMJrUl%P?&w{ zMSN;Ub0k{}o$`az89_X){N@(fdmE5_Ta@fdc;yD7C&v-gedn1aPT)4!gL@Dc6=Z`= zmg$L6yKv$fT*d`Cuw!QsT9^xNNxZv9tY@kQ5pqVGIDZcSwvuT>f6=3WQ(;%+Dc4vI zcRem2sd-GW+i>#E79j+Um-kSibCmr4V@P-4c8inO1{-7)IcnXTA|=^qEv?AUwHWbO zx)qhaXqTN)knm1`#cSVM;+aAM8tw&39~xUIICM84&YEIoeP5KV&&s%n7%(JY? zA6e#}HivPVFS+7JbWuV+Y>%27l* zLb8|8sRdcfeCVl3@$~`qPn!Hua(4ta+#^qiXhvM&A%(4be&C#aw$yO>JllrXkPTXB z+^A^bvJqW~;qej#f7SDH75^CBepRo1Gx{dGF3|&D=6tR3MEwf$4(V$bnmSZ(1D&_Y zju1)r97jDr6_7y#m=AK74eJo4&L#M0F6jcStZV!`sVXQr%Ed6w~S*_}4(rTBW z*d|}t5XX>rKwOO7rvKJ>WP|S@SW;;B$Ivrzmki+l$%Payg}!-JuB%Y1S` zwC9fb=U{yMspRR#B^C;KT9%AU8%&s3xkW$7i}sB&l!ai7zbi7a zoyU9)zadfAZfytMa%stU2+L*(3d1oYs@{D)O3L1}byIG?83pMBonR#R2aRjOP?QV}b%^F|rLTCZ^Gr^UN4gJQN=X<)%)8 zgx2n@&4v`<(HG*bAMA7c_jpk|GTl=TM6gDL(NM)xMnWNoQq!5Yqi8HB$IP@YT}7BO zP$!kM+aYpyn&reshhE7gukTmSJw=;!4xsz7kpREzKuln^))=XH_NUJUnTu0QNuJ3Lfj$Zt-u^W@|3I@Gt2xXbesOzb%XaCX zpno0^9=fUH0kdyDy!KgutsJ0cK<3SOq$3UV^emHMyK+dEq>{sWosy1QHFz{iR-eCiavY0w-~q_>4a|8t-;3&9 zgO{Zj_ubh!HrcsiS_uOT!$P^)9{m%n3g@8w2*)IwsShrx{zmpc6I5Lk=sBc3?M`(Z z7Ma;LMk>9Co}JRVgC=#4`9$?$Y+1jWn(Ug-6Vz1?)BM*`U4?3WElH)Qe~|+>Z5-%&26;1ix5~V_^t}_vSGcU?>Fxl2m(E>IAfZWsZhR3vSglE!I)=3NQB)oo+|ka z6~Q8u?d;LX-V4k03EFwNgbCdfp1iW~6z1Y*B~)A%Pe$5ES`9lv7W*-Jx*(a}KNj_x z4Wd-i5m%R7Y!Tsfs!}Z$bjkst9%5|9*tSR@g>V;j;ALT%QY)JMSVa`%W~j&_6nr+& zMJjV8D4`n5AkSjt%m$p>$3tc-E$*4iqAh+z^k3&EKc!zq^aSkB)5@994J=XJv5M&P zvni4S{S@uN%-2>2GpSB`oMi!bp+t+xuZe8=rslUxz-Uhsl%d)q%wR5a7w7xg}`oNX1Z{j+Gl(s(q!H# zhQ-6Bn4opgaN`!|oT`ULZ$th|xUZDar(mEmJxVrP%C2uwXp@>hSHFurHI{Rxb5j;< z86s=@oE>`Z++29uCVQV>9O5^MBasT>7Lv9R)Ojx`7!X+>(_(G|MKQco2p@{J6Nd*XjUU1gPCNk)g73W2h^03`q9yf z0E8W9vyPXtI(#iS9YbLJeURzoWh4w+cXWLteJXx<6i#+1AwrlNB&+{nP+tNh+E|wv z=9f|G6oRW}~&WV?Bg9!e%R8<&o;6xW8}YxKRD$Ub4mnM7SP1*SGr zPI?Y++m1REj?;WF}-Q&vRVk$T60)pFAa~X$f)&~p35jgqc_WlqS*yB z+>b{AT#XlYGs05+(fS&TNld=sS)-~Tt^7SIxBU)M1O4ggH;VR>E}zY))w6x7x*!3i zK)wopUk(je7`I)$H#O}<+yHf&9O}7O)B}(A(bQchyzu)CXiw@QZT8xnN!b!w9YdT? zkP#D%s&!tIbnwR6xU_JK;LptRzjqB?9yL~C9>`>#6G(D&vXi0_6|oyJ7#POKxbx-` zwahB1c~pD^);Sy{_3ZECR%%(yr`Yz!ywW&uN)+bE`Q(tF1f@zMjGS>DBbI3z_8@qFIKBL`98U9&>++Wv=Xuh z;A~1>e&kiBCZPzYQ4tZgx>ovVv&w;C`0B_nIHlq`_?lJ3>BnBl?9~tCe=}TXCcbTb zg60w#UKcd$LcvwgG};4k8rU)%(n&qkZ@Io>r?T2fRW~;h{s{R7Bdr2-3WWU?@4>{{A2ZF);^nYh;>-tKR}e3jb)uq|QaAk8EJGrhRyjIIASgs2Ur7W zY3CfTp(&I*z5a!3QzqRpqJ7!4g=dj<7oP&#?ul@}ZT#xJ1;rt?9iJ~gqlxTCcB6&A zwjy|2dge_LxC}wdJa~}&LAtUVXnv^Y6?n6i$v{g}aRv{nM6@mL+2xkMmxVJXc8d43 z=2>?6)Fdncyl7Axngw8AxE(` z&<5oYfo&wJ+LLIRvRhG@ktv-sw!05pKb*)v$|I<@ZO8Kv*e!TC{DAmNM83fTb+|_0 zX=f@|s9(Y_sr|-eVwr#g@8}dBgtk*0@8)<&d^2zl+>Gsdy~plKWE8WCs!*2>kqv$z zAGnqYEWg&^eLDFWRx2J%!D%;RyA(RkbcWsvv}nExYIFK0oVVdD)f={=sks{IEY@E8JIX7aALa&2k|i@s;;#V(ST2N&>Y-b z!{?p=*8)4aEbD9^{bpA*`&QCO?`3J=hSiFF8gD6wajHAb0{*HmvUH1Fx)o8EqY}p~ zB4YPN&~T=Z2!jH%@K3>LHr?t;&v|BtD8*l&Fx~EyIY{t^8pHV!I z<-PWmkCC82{3+MDZZ~6-;9~IO)!Y zv$_a{m^{jf^urk7eHgVY~Y%t^AuU7%hDM zH-JVsHbdU$dVyuo>P>#)P##Nq5H+9A4Ox=}(T# z8wTFWC!kXnM?7b|AL&rT9!GhvQM&glaH5?|BmWc=k2y%1%T)HUfeYVO|9-O#&opqsq~F^4b$Uxk9tEip!X_261ID#TU1@`4AeZ}jM^mbVweP53Tli8~`M~E^(CplP z-wD1LClQaRv~w6hjJ=3@hszzMg-)c8WEz#TC!XdfY;TF^Cdb5)EC#qyIxVy>c*Ec2 zagHtA7~RA%RlHM`Dn?E!b`8R_XUD=zoVR}3yE5^aV6fxS zC{=_-^9xWjCKW$aQH{|ipyFS$8Yxwyfet@2Rl7uy}C!1{U9$E;p={N<%yt#X(z)kL>aa*qpFo}Qqux#7VG_i@6Bo};@~!rLV_ z>6L?5?@voFySfkN7%NHRMp@sv#3JfmI?n#6;X$t?>{f9@o$L`8%W%~DXf|EO(oF|_ zpF=Ld=k^P}0|_UPG52xb(_MD-gG-fXQv)R414{6Gf%H7>1T1P&xYe~FASb`^hai*% zr7TYVlX2?i3*S3k@7G+ON0}syChsKgD$JC;ICXN9f>Qe80OM(b&GsWnui`1!--+5$ zpT{C@_r!M9PL=Neb2x5$T2=;0l8M@E)P)=D_Bb_pu`CX#Ipwn>Z#8)hi(VH{R+hhL zEe>&FUFpjdRr{aAijaIoZ7|Wx6AD?>cn3=`jpS(TBU=r|Oml%K?yw4n<6mqUjb|zs zE9AC>&;3(@eP#Ga64T*iHQlf`5N*_m&{S{#-P<8RXqjww8mEB750-Y90?mF1kLq~0 zDybBPH$0({$*DM%iz{VdQr>Gneo`(6!cO@Qu$ zg1JhEMlFZML~+4Uqf)1D-!18;bmwxcSM-g-fge~Lpy*cHTIM=&zj)`_n;0;uJ?6vX zuCQ(;?>}Uf=a#ghoB6{t+eRoWV(L2IRBhkJt8+G(E|Dq?RjAR0#IHAE^CD1JeccnJ z2l#=deQ)<7eO@&Yw5W#5R3uA`UlMoLa7Kj<7kYj|jy0+^7k&GBXgeR+mg3LDGp-_R zBMHr(F9WOo&b_8YLdf;NYUCA77kPiNMf2J_u3Nuas-zkce6w410zab(k-rCc6}x_! z#u!|Any5W)dEB2F#zlFWTfi?QbJex^>ii)~1H0@Fb9l1C$EobbaiX+HL))S@kuKgp z4BkD{gqAzJ3fEc_0L+qlVB=doNSgU&bPey;qjdHXxy^0*HpLNEk#NyAvMOOItdX7WrPg*W+a!tI<-Yu2(`v**Pdro^kaF>f4} zldfuS{bEyHfKhUzn-9%eo`-viaK%4R((|7{QDgQ6PWDxbk&oI|gN4oV;OYiS#0Bpx zlSV79UBTj_^qAv;JwN$8hl?u!pL4qFZ2x>kJa<`|lioa&ul&nnS}g_^srq=$z3mdr<(;9q^Gq8aJi;!7&F(!al zPGHVNyn3qwv^}u?G%cdAKXGPj`1tPd6%F^GQLMGy1s*|`$_GUj+7VrP%O*-N&bUaH zR?3<$w@HI6dO-}FA|P2ZJcj+m(Sh-^kb9LSg1Vj(ya)0LjxN+rz1ftDW#dluJ)Pr3 zv$PP8FREL=UH;3(2e~P4|CGUHSNWCqSX9t}LOyB^H_ay}BjQKdi?Vnbco)8lT~YgY z+;DHWU~LEEUZz$%Tn1yWtBw^18H*#$+#zlXc-V2H8slDSEUS3)OTpq5;wnf)7!}I$X~KCQ98A~k`nFA8L8C?jI{Vo)g0c6(RuicQDC4exKVnpc>_JUY8YKR?A{M?f=M$p)2<^6=+E(vgvltZ% zcfgb$3pEWjb4TF#jMEs$?(a|Ub{TL#@GnvjIf;p4_=R0rjA}$1vaKh2!mRJY3Z`7_ zq{fP?@+5~=lS81`hY^~cJ#_h}(&gu&3Zpqtg$#)`jpySMnDPnfrE_Tc{JoB^A7S6R z!fZFCNwj8@D6!6?JzVh9G#$k}jV_1ufU*yLyFr>|Q>6YtH8?8Q3_m~wkQy9_`Hb`*v0 z9WE*B(VF%(e%cJCPo5=J=2O&>ID542e)NFQ@3Vwy!-5c9zoBx|P!ti%@Xk9(=jp}G zwe5T}VxHk}vL|O|oYiNScGW7)Ua95l3$B2O z73?dW=GD##`wo{F7E{ZD_Cy481fM(A6*++pgq;0ivk*Q?wI5i>$nCNQ-?Z83kLU3k z&VBL{gQx%{ zyF4`?aZ4u%={qZ5FT(~U>pvc9Vami$?c{EE-3lc637c#>`b23~$(5Ly%Af3`-3m{> z@+^Yusl^y6#cE^u7Jl~AhPw$urB6vx;&KBOETPaZ#Lie1#{@nAm(k9Zn_4dnivDwV z6d)CV+Xu-fGZlFpCY!`Y&7%T~`|tQG#PRdonL{pl&iQJciB$UeKdN^nH2MxOcG%k1 z`Wx2vb*GDCUNJf3wdXLVfPZ8(R}&sDf(-{elR#%p5o`Uxj<}jWea@8`hq=A9cw1wZ zQLXX%vyrtEQ&TDSf#stv?f!yw)7nn%OqOaH(9rEogKLU)=SY8F%*0{`;(1(q!f(6a zN2UuY34dzyf{sr`KYc5HV4$~+`iowP&82KV%2H7eO|9jQuVYs`nzPytw$$Q)vCPb` zNy@*?i$|LbY+xE33)(ppo^H?b0E?%=0xF7SM_nSqwO@I+H^byMN3&lHopH)%eWju} zhRP-vKR5@X{Bw>UQ-CgkZP`=-HU`tYv2eh|S0CKVsoxeg_og0_1zbFvOkBkRTksBnNZi5BH?qNbrm+Sius!Bf<43~BW23I` zEeW+_FPQ2$%zE6hd*I#~CUG!bfFxLPlKj*@7Q;`oG!<&@RBLOBF&?l zJm4>ETAhoavxU%x8Su@)?W0J0)y6RC$)8=MB>SzS29d9ug>SAu+kdjM8lUD(EuAk` zo?G9@)F|pef*z8Try~dcEa@ti_C)lA%IUE-7RH%0FK+#Nl?hBZ^}ZWPwd?Q{^Kl%Z zsb-$tF9Ms%hpE;h+Qx_`6?;O)>fD5Qik0Ic+rU4MF4%A5H^6+^TXnA!V{>zq~ z>F)R#`6o-EVffc{>O+f(Uu^cogD>C`lZO@!8_QJcF;`1s-^_`~(YSYfkpRPtq&YtI zSytd|?AV@beXz2!D}i?AOQwtnXpy#@Vy!pZ-Jd*?m$!5F`ATFp;K9Hm7vC~p)P;dm zyN%a;OZsB{d9L=M2Pon`B57+$n*sI#fFC&A^f*cAnm>}CV+Q&=ovCky$2&O;YCJpL zxp%tS>*BNRiml&NPnj1oW++f$tPxlp>x*xWCECkG1 z>qV<5padQAM?np7hf-vVn;U9%oB zSo*(pBNX!j#`AqZAV2ZeLBF$ad0j2mQe8dT_S(2nEiwe@@ug}ky0_Tt2yVWb;%2_SPBc|}(nE&O#%7k@u z zts*b;wu;uwrHE{pa+iv4SBp&0fR&;%Y3vV5Xj$ zGfVo)vCxC;u@d|5rkVewF>#1r5&TB zV#$8OW#QhA9C5*t&ax*pzF?bfU+%I3UAt|vNLC-Lr1Fobgs6@x@1dAitj6MBWbCkY zhW_Vp#4a#3Zc^SpS*3{P!UVf+GcSuJx*Ikai1jt^r351KE_8RAtCS0PZ+Mr~S0g z5Dw?O^H!<*Q<8H!QxMKu2TjvSyQy~+bAMI>dgBofey4&?4n0qI@dvS8+$KC_mA4_$qjpvhiKJm7V}WdQ8iN{Wt^I5HJ=yJx4siUzG8$)csurOgy*mW zF>ux(DmY_!JlYj=qPdbro=yf30IN0@hq^3wfPRydM@5YrM!(o7wBz{QVR;jOCW0OX z_5FLM$wCie zk8LeYjTWfch8(d8WEMdv6QDG~aPBYDI^#*`YQtzI)FO6>nUf($oM%0o_;C=RjBpg# z3@_Yp?>YD_>al>aEEAkvXb=TaU8QUw7F_IKCX{teEFKfe`sRHB={fQZ2hfxSr>wNk zyF|`8=qgyy`FeXAE{$v-fcQ@I~)*dAL5VZ>w@| zzvzHYXGEQyJwxc%D{tDP5?q@xGh6wlk6>}R^q@kMBWBnky6%8mJ}WafDaxQ-WE}jY zV>gP24J?=NLxbGa!X_{A4%E)M+2$`VZR%FPvTo)6*!Q(Nf8RQ^c0Iwgj+sr_Is;BJ zqmF{}Pr;OyRk>06!4b>OpMU|nevB!7yrNo@Y17zc%nN8PAsn+tVGAIo;4t1hu$k)q zaV2b|OmqV+;Dl(-I)*s4YAtR%HFe8u^NeJQP6vvs-C|TSoSFhwBxAe=B*Or#4w`wB z(4@NHy7R0|VrEgUOkDj~J!Q{p)gCYPEZBcn@KGUG)y0z+QrwNFu_iLcOI;q zoHbUm)&*b1CV=Ptow4rC6nesj&IY(^?Igi|o|Nxj4$Y-6Ogsg%+5_ilu;m`h)~j1M zRM=feE`X)2N@!sxGWS@ve9h5^n_CIF_(S@kV&^Y5a+$nLGuV+C!Hf@;n@Ohp#|3Ho-CS!aDu){1rL)D+5uAZSkUJky#0d8<+8v07O$9Fxs zV=r(fzviL6m_N?!YHC0A=`)$%y(vvUvpShx+vKMl6v{W;J4Z!3xlcqh8~D$Du{F>O z0VfpK1obnJ+Ic!l;yK;!X3;TBZ>-#lVNDL)zjvzPSEHG%b6Hw_*EP!i$qKE)w-s>x z41RQkpEfipGQ#cQA41+FAIXmZPI9et!SxZp*qUEca#;^r9(YtjLc)@M9?&uPpYXlr z1{O0f{ous^C=n6NJnO0{bzsuFRwIskeWoHbQ@xoW0x(*hwHOR8Pc+s4uXq(^{>x-) zTD(QzqW{?wFeCW?;&3_G*|~YxSbP8fUmUJyXnvEHSyB~-1;q83|35ffRz$FHA*|)r z8-i=qwDgZVOHz}~ISdGBbwVX{(TG^s(Jpju;664m6Bb|5a#2Ae=hgv={TgdT(lf*= z*I0L=Hc43ncOhZvTc5oJ12SNaVt^dsqkmncbPv>Y)r!Q5rN#NyU6-7Od&FkUah6k? z%9$UOAki=Ails2>-1;WT;Cg^uhKU4hxzc(5soqGKHAFt~_Jt&FlR|pN_5YBXa&5+2Vn3}@m(iNMs?{1eqZH?_ zLN$@2HCrNyr5}VXlSmhQc(^M|zle8yiW^A|1Gx-pj6g)bLf5Z71JZIxsbVf)HLW45 zx$kxB&Gh2Lm!}0O?}?ENn|a+De=peAN1H)QAiFU>gmp;eGiZ|TbgI0T$mgAj zu1%YE{tgwHU;q}R8)N~ydhoZl#b-{wz!^=kpN?3xMMr~GZNzyh*0g+_9lo|`irWS@i=hH%3Sms z=y+SsTMvv-{WI&g@nvFF^DE+yBw$J97V2G85L9%i+@%e|J@Iq2+OZ>p7LNba29wp6 zL*bA@)p$F1AA(rl1cm$Yw&bAs=B(Yb2H|YAO#cZXM$Wz%On;o`shFly>2B%DEz9J< zbb95Sa%Q#4Ujcvf!83p=elcJ4;;?z9Ud3VLG;J0Wo+$5i-`lapc}A(S-!$*qYZI@V zsdJBS@yAvhRU8RMz_cPv^k7Vk#)qk0;YAysl3?fFbtAj*9xd0uXZhMm%~4h@WqpOI z>@*2)$d6}cJ#0H-vyPS|jg>IXuxHu#{2tycNrW|edd~XC^t42Z4o?!TJ}GJJab0jt z<`mJ{S$FVx`7;_l@FcN#-Zw>gx?pXfbsS)PS-Uw!y$&7ICnL-gnM~*S*6vSwB4<8j zZ}ZyU4Fa;grnr%@`g6x`g;zT1T!HPDR?Gz}Q1(xIx$U*Aw(eA5gjiaCLSN3g*NMJm zLA$m*C2;BApmKek*%Vas2k6M8b&hpS*drDJROCXRsST-#v!9mtGxZC}a#T|C@PP}- zhR9RI7T`CcG1z$90il)J{wx4SBh02;Ca8T*F-nu|o~wxLCW`t7LAQEo9!&+s+*%z4 zphk6wxp>`>jZ-CRO!3FuScaZ$a}ru*uu!juJ*G`yz;?4AQrFuc-QcY}+bt5clwU9; zFcRasf9>+dPbGOZPJRl!esdeAqROY>;{}Bn8;`NO%<8|{!>QU9_on_Wm)u8V-%|gG zMA=9i=fCuKZE&hdyjGzU?)iIqq1?6SvJugc2%n_VntmBQQ9oXKEMb!e`SlSth=3PX zO~Lsrew&N@@_FuFBwuBNgO{fQ-6ueA`Ob2*;!w5T^GdKcgbQ4QD-JM!sqj>Sgb*3P?A>e~$c=U+_ZO7_owSNpmQ zg%7D!+jq_z3#8q6aka_UUEf`JdBeaj!e>U}jiU#T6<7Hdikb{cz44N01sQC6A9T3G znSv|GsE$;lUwZe$ceE_FvS3Rf!X#35c*$e&?b5?4TaODak%j6Do8`~Mi=E22oHx?V zK9W^%jrS_8p7U#H+DtgN!_31s+wTc%q5b&o_cp&y+%JBcBDsdVANW{&lo*kd)pS{s z9F$!tG+CnC{zmtQKBc*U&$KjLQPxH6`Ksb}fod;DT=Urgt%p}?_+WubL@ede`Fj%~4Lq4QyX_x|b#keM zLCTtopGHnumppCfvDHx3vHsrT$scKA(=PAed13BVWF_|lQoN4RMr zBYt}JFy8qL)1(C9>8VE@%RzszcTbOoq|+f69uMbiu&3KIn50fPw!#wsIjEo?+0EX;7Iogdg6Yk z{7%oh13ifvPjxFevnNw~+ul-_<1~|Eugtr1Gjz&M^6WO&$%WG+FAw5eZkc|hf}`AM z$9*30^z8Uuruzd%@Dy$FAg!CZlcc$Jf;(oV10ZiFL4^9%gz7&OsPCY1lngx3NA{KY&i^;71cq}*Oj!c;HC=3Zo)0GuIEmHoN+_QM@ zUu&S_UERtGGOWC=^P;fYT%7dSO`(SZtJ~ZOBQR4av{8fj!O(C*xZFi|O#AME7Ccyn z%@9)-d+!uDr>oBV#O^YwqhMgCD24nqI(mqWP)2&H!Cnpgqb8vKB9L5b=Ply^B!9X+ zjO10@w)6H47j@X$x(xq0z@brz?hT1dAm9<}N zZG*=No3Wbo4S6AX5dvQI4DDT#chOTLFJ{RjXizNd zz;zF#qV~vFl-thw<+ispg{vd!#e#E(o)Rq9f%$ztIz(<b!c> zVu^6^(-&ECUZ=XI>O%yO!EnqnA^?d~=RGO*@fg+Qh*A^Le#KBLz?t7<=&ng%3q`Gg z&1oBdb^<}qCEgpAVf~20FnwoDXqJAJijT|{&C(zR+-2W#AubomvRWbf1M)|sg;7_Z z663{hrPIUW(!P+VQG4LD8-cMiqCV9ZGW6ba2aa9o|Nf)vsnS5Nv@N0AQq)0;oTj7R zPyQ6l!AREay>yXtZiENZl4E;aJF{a35EE3u(9#qcAKX&>DNEy#Vl7erpQGq+-zov6 zDu3}ue7=N+aW;oX= z!L#8o=8aQ3bDG~ZnxfpCK}*uQd38L{%`ZN)$!3JjYiA%SZG`l1=$PyxYGfnVyyAw{ z4XN!lX%%;@qDU?qywg|dBN8lW>R}q3>ZTT%8x>3-eOuSl{wdYYAVfE{9bXVUuajKEl4T)v~9i8 z*$an5cqcr1LML&NMVo~+swlrDO`9R(1v7#Ik<0&4g^it<54o1SlEID==hyOR{s059 z1$Sk0sP3LT*zel#QfpAn4M>z$g3vT-_p}jM@&K8!T;F$F&%@&6p+n z?-+7odQee+d8XYV0C;pd^?W|HpjY%`^l&ZdI!gD)-PNA7vp<_?o(4|^4&HZhelp2n zTUqMc5?)&KMy3dWpw2$wC0I1B1K0Z+D?g&-VjxFUiC@y@&FIW=z`ajS-cIHA+b_^CA~*(~#Wy0y@}0 z6fRg%k8lvuo8n5S?R+3w$wwWg$)$ezv_a7Q)Lz%&ebhW7Qn}#e&$k|3(mJ=FOt?{; z>2lNIAMwB%Y+B5lmHV=*X6opnXVu;Y#y7r~6a?S&=2A7YCDYZDFX_VKuA{XKzQ6@C zzF}tO=UCbU0fjo>g&v}AiJXb1^?{nIg<7`$Ex+)W{R1^esA%7m-ozvq!A1SQ*510U zfCkYOUkC4CGZ=pZoTf8dVaavI4-Nt2=(xVjXZAc)BuN`YANUBAuiC;{=W0M zDDEhi{T1>qPsr9Y(%UKT`K#7h$7SJ2R(@(~9oRr3FXTj(vXtJy5 zfm)MEb%Pj1L+D}B_qjXec-z+ke_>s!H2Jn_dsq6#vO;!slXnCbQQwPBdDwf1j%6~zSiU``H~3ebL4;}g>GGoo+Y2T`9YxjM7Ad}M zc^H%zalo^kmw!@E;%?8HI@dr|_nc(gA0V}ub_vQ?p9i-jt7?JvjmmTUz17ZIQewOL zYpNwqb>$tWq8g7aQ8yLCJOS*AZ|8m(Dc_2S%qIyPODd|(8|U!)Fe*DzlaK??KS=3GO!MqUnv7YS_PiLgYf8g z7urIijuRsN^Zcr1gUx zPF|$3pk2(FgxZtbUGOLO(}YOZUu=Nw>+fRm+gQpr_%lH2I3e_9`*A{8e1gMCMXS5R zNp2J?nPT_>xV;82dA7Z}aqQa51b@o;#TLpWchTiZh%@}QD(k0@XgkR|IZ@DMm`9%& z;2PZh>EIu%m>N5*Qk`R^l$BslPq>xPP6oHpqZ^MCLex&cq?OtO@Fy4JGsKVjJXWDu z->dd6S^~;_9zi;DX5vreNoNEmWf}2>;(Lor74VJQdlXIbOX~|koMM1LAi@xA?JhW z(CtTT{R->EppmIZH=%C)oP5m-hGL|QQ*UAn9(GfP+rE}NcJ_8~iEmMr5Iw*4k-jI& zH+3H-&6=Zm8TM?i_poQUaBW#GQc})d-Kj)TapLsnL3JmwQ6?KAKGC;ZECSlXD{Ir> zWtx`YCR-=2juPY#R8Z;++s3m|MR~ce%Nc%NGY6kBTXlq;rSP2$h%avp;@%z6?*rRi z>25NqIzUq6K@J!}O_+#v*W8YJpxxAQbKnKHy&!q*9J)};CQIJ#A>Iwvd%*Z&q#zXH zhY7NcF;o|em9B^E1p_^xO45@mql?^54H31yuGOjBTK-!z24qn^@zYP-8ak#>2*^JD ztRzIKrZMmP5^LDtVd`&%@pEt)h0T%e3Q*V->jNE9ZIYr^B8fdXZlJc)%5N?A+(edA zdlNb^`;t~3Q-w{<;~kzYs&HM^uRBc^6MLKBFV&B!+E6zbQjGcpGY#X${NVh#cZ=I{ zd-sw4T^7xw`#z5UMVyXN&PeIE zDJ+q0_3l-(2o@8hsSs%%JA4W)$=J;Zfq!1$4CtGK1hm|54E)0Cos^c9C>1TAbWO|e z#Mp#}k)5V&d|=2-!aTzJWDey@w%)8DRYv9Yz$)hdeoVlW`sj}fO?eQmq^^! z^cVSOvawJ~^{@#=v`bIpHfbps!yU=h1QO& zJ_H7r7TUEEVhxTVR{&VPNzIU0<#*x+p1CWh@IPGe12{^ zfphO8h>D-T&Ukl;u1)stt%K)Gr|E-YKfZ<&Ynzr_m615H_Y(19>bYJKd*^c5S|K-8 z3h*K9`Q&qtl!U0Ncf&IwYJL|^1UhDy-~TY*+?GlFjJeqOG(Sgb4MQpQ*p_%>yfuH2 zx8s=5o+vDl-D~GyO)wMuG%eR$tJg?FL@E8NjCBj*&WxoI!S3NFkkDY3pnzS&Hun zo17npRPPN~gLEhSCtbLyG)47Cu+FFZb~A)Yi3Z?ivYGVbvJO@gUT(e_ojtm^?C+`> zGg4JB90PMkD@27>zwNT|z3O#k`~mI)1(}eYSjf| zEru4@y_M|_2KGCNqZnGMgSS_U3J}85CP3Iqk8-Ey3JzFc&;#PA1P*&i8I8-G@#*9D z7W?)Vh9*+5X*cufSPYlT&RN&m2f*M-BVh_NkU_`$Ak%Q3muy;4bs}X-AB*z~IjHzl z^25J%+&*%9rhWFtsTZ&)so}1@m(Lq0{z&f!3FvOR&YEY<-e}G;&9A*vF(mMaC9Y$7 z6~Dn-f=0T&?vd4lGa2Bu&wzY7tf)N1EGpg5r#cMNjG46-;9x_+v{ilXi9{Ee2)`&0 z!HfeBX8Kn310woCAgUUWSlj-_-J^1;A9sn`?YZLvg!gLOi>j85V6l5mQ6I0RhDfg@ zp3x4$i}&V=6{x3&7E5syZ+g;;8xD*3%K1VKNnJU^e{sg1ZJuZ|PlcIpqnuH9RNFhQ zV{5&9FF^J0(-e&x#hGFsuy9zcTdYK2|ENvf_>7{s<^0Oc#!E!McM}iuWEL zh(uNt3pynWM|sN2D7Gu6%H8cmp9`70OAkTVuwO-|x@rHY^bpyA@+9pBB_`-Kp60d> zMhDz9yC_lkcHB+K+j$)-$2$Ex*A**Wl{>d?bo& zMCHv?Cr6*|%y%e%DD^ink0ZO6ZN_^Csc8!$BlZHFwwLM$976|zYd)_E`AF1OT@8h3 zqru4RC+7m9oWd@t6WuIwHfcv)fFZi?6`ZR1_|Sl1y~WC2`$#Ho{bW%u_a*3rCsfJz2Fq@cxlI4+Y!ltlD@Dsg;L{9CA^=%0yV6 zi0McVD@lA96ze?WSFafs)76yM961DQSF$-Rs+iNK;=~Wa3PQ?$@+3t**lU!9k=Cu^ zs2|0m6FsBK#D(gn;sfW8OgBURnrtsY%lxE^DPp7oezb=_;T_Bh>DJiDvVL^K5Reuu z8OHMgc1P!iPjA?6p?8D$dDkn!GN}!?Ysh~Oe#Uo_Q=k4Nn1Nu` zEbM8S(fu2>`l%tRDVL$$pHTWKMj)L~^f0OTMj57vybF9mGimXoS&{mC4|-MvE6?R! zXb{`11U1;;vgfO%76y|X)3J1X(=RrzGQWgA*qMDhhO>%2=N0mZI{JHsHCjh< zYb9|j(!dDs1Vr7YmO?d}=A&GO`BMC6MGOuMKUVUnx>7`4eRc?XlEIhX_ct$|y4>;l zx@!dhv#QFtbkKmtxVg5e`jmxcj=xm+(Rrv8HM`R_I}UTJ{KY1X-Hjtln^?A{dfXoP zFv@YsbAk5bV5tp0+2OkIE_5VdZy)C#eaqEjkcsUs(O;QjtNwcH@!a z<((ym55u~jO=})#S&I!tztCRaElNfAWBQ4DL&`pdD&;2XS)PG=LNp`)8lp}}UX3x( zMND_4IG58N&j`X*e=rXvPUQ!G{HFPxGQFZB9gv;1r(GC+%s&WgUUdrixt?HW1dRGL z9h512tjL3JBZ8&1g&ORX+fqfB^faFUEtTGZ zta*WOb{T$HxNpsFxz9yK@5o9(E>G&coil|BE#AsTtclJVjs6gjxfw5%3IhP1X7>%e z@RS>RTCviuPtZIs!OznAJr5jKbnR zxGYe zeGv)*ng(Jqh3rP-F<{Yuqw{}Xkn_GUlv`?BR2EgnGtSr@sVnZ1d@12v`C5R0G+W&c zSevZ*v-_oMuoMmSZ70{@`9L-kwik})CY!3JnM#Y*26y%h_^?0AUL&RJIYMsEe}O*v z-9yqkW0oT=dx=G=DD3j&B7KY{ffa7=?o6IbbZIzhASD0*IT)Jop7^}b*2+=mKub;d zvp1U`^#wy(57j&0E?IGDq4-Shjnl?3pHl?BoFhqEwcQl}U%WaPViXsgRhhuEWBQA& zh!&gM4iXv^k2Q1t#da0?GeJN)rd=)%W@UTh-vP%Rg!k;jfD6i)Qe%%HZF1%hHS0WE zK5nV_iLA=kZow~7y6>Mb2+g{CAF48syeF38$ksX9GOYqZh`rxr8!IHC(Kl_(wX4%p z{2%sK?VJI6M@}J!*JH2OU*9-1=Il9)%YS!bCwCJ9qWD;SfZQ3*a7a+O$|{jeQM8ND z>?i4_x(+eZUB>wFmBr4s{)Z0vvjKofVTGsmgn-Q!vGe|~R@X|vt* z)B(>__trtyDe~rqVVS_*m5p;u8bd3L=Mme$KB!B<4#m(Lmk3#is!?IT3?)pXspkN zCY#>3byfgZWB2JnRi>#6N%;A_LcNhS2LLy}n1N8MWJsw1)(R+_qmTn{t9D4Hq>asPW-b zD3fzDQI3_?9)s;)GI%a}w2}(v@)&tL$}vM;|p{WYxGg+velfkn(*8${h@x z)u?WTeA*1WY|a@Wv36qRxe^wlK_}{BK;Usv`sz?uKHI?LOP>1^i>G*r#fZK)AxioS86EO zd(zq~f?2koBc|-uE=zzIoDhdgsde}uH}rf_TL{Q&*H~L(7fRLj4yox`$xQ9U2uIr9fs+P`sl0x;rjiOR>f$ovBrt` z+amK<1N@XgQ)#8Pw@OmNsg2PuBcg^ba=ZSOFW0*pOKCd#y-@RJj|-sMQx_E=e{;}|l0g4TEV}mp4_k|ua4Vy3nId|4; zTF9P{pccG3vAHntBAnb8td3;{3^P0}yfG2I=l@+gn0`@hHwH~6O_k@=^%M%1w zQ-0tP>QnKB+XL*y?}Fn*?m>hl8f8ON{$iPP6(}ii_M_=>8F%^?cwhGZPU_5Cdbdf} znMZE)&m8vc(Y*Qv#=nia-X0Z*kl?a%(yxe&NrBLV2%gJ2Eu2CsiaCo>XTeQJ=uc6p z-}4qVbie?8r{j?MoVu4}H5y4e(oH;3yEjMr6B2U8KN`91nYNL-=4m>RWvZ@Aso2m) zay+5P^WNBTE$6B0n0XF=XZh*Y_9)4{=WAqBW%2YcHbpl*=F+gd2>pFfe3tlY#zlZd zZe!d`h{xVFmz?_KF|J+V=%j)2#ow!y?YV1w78SO&-hLO=sQRFhd#-*|2RFVL=;{m5 z>i4Ly+ca==NEQ+@p11PO5~pL=@)yI0iY$V8?8r*IL;gxp@xe2vkeE%=u5=@M+#CL)5cGZqnS0>+~Yo5+|C;RW)kJde={ zDnz*j5i06;P~ghEq`_$I7cWzD^K1OkQDVo)F)F+M z9s>RNgS8i1{zb}!Vig-S74~8V0L6=7pD{IMa$p^n5P4o#`$qhQHgyb-BRYng$Yw z9N~nB{Zgx=pkyx(T>ZxwPXo7@#{6L66o|9rIw)E326XZFA)$wseP5kO(!%uDpE^|W z{1!8X@R7YU0Cr>pWSkOgFxctB*7H3_WH~Puk-L0acR9rJk5p5uUHGAVWMJX~V9_`- zWZ!(5!{X-^dp-YB-!@x|B%jn&V1Z|oDyBSpPmush4e`J|=nebpNi^5C?qtw6o?9E1 zG4qp(SYP*dw5elz{TClx3@mfegAMU|d`jdBvTD^IPw-Ku2^fai@1=kCn&k22VvbZe z!3&*ZEZ+B1l|AQ+H009FD_jqSvAGVg7kAR3I@Ut`elsBFe)G|$3K5PW9m{JK$f8Vc zaTAwd+n#ZeLGwSw^F!Y_k``2>uIb%SFI`$E4K_q&NjO{(pi0t&G+9Hic*8)>vlIT` zh&EG0r#DX&D&h01dzWs>!uPr!pZTgyg8CkkX#@tT=+?l~h0R-Tc|?G29-$;;sPbu| z^Y^^4g)*T-o_{uCi*njBJ-66|md|nNxQZ<6e$EeR)=o4T5|*`?!uM#2uGha+)#kz4 zv8i}tR?aW{r*52Ue{LX0^%e!`aMpHSHP}6I%bbceo`@RjXb{yoK2dvC+`H)ik8#%D z2zHJ2wxo*My4O#1=M23cm@x;fn)ebOpZTkS$ZG4kJeFB;8tZnKJ$1HTTRcur_dHB7 z#mM*wTZr{)^QGyzY|E-9D`_k7+U2Dxie8DyER{~A+LwJ*%gZeljlR>VmN%e%_-AqTPxWAg$quUCy$Zp+6h;B5EZGMCpgM|QFbMmjBX336B`qA0g z7b_WSEvi4yD0Fp-K_%KqzI3LA;Fk85vzK?_#b z_c2svX*xPGK_xlm?7Rx=kp^syig(L=i_Gv-f9HHeiz_uEd$4dT(d#k^;2zWO8tIP} zu!duJP9Kw7DC(Y@GtD%vFgR&V^0K|FttlvDf1-^r8^8 zMVJ62nO6a>0L{5x$oG)P6V;fw%pTMbP?WzzI$z|ZY}V!|8! zzqJP~!QWD=I)EKOdmW*!tH0O+PWJ%rw|(6-I@PH@_XSH<%RM%MyR9PzL}5z> zixS0=2PZ_bi_xF*kGJNvU|YO%Qpt;lww8I5hBPdyj~b8(pqssWdO|&mH;v%joZ}N=OIH+- zGBx(+3nID|k_WNrTQYe8I9gu@(RWAARIn79opS)jz{$m1AbTinY#rp2`S;P zm5yIpyuV*ke0S^3TzdN9ee!Uh1?ZxU*nIn67#R4N?5JeR6O*yOMvF%Cr-R)sGnfc=9p($oLmgJj;+{oegF z$Mqv6F5#;FJ_0XxesWu#`0*I)&+|D-4=WI|BJL*h%w8>tbMw5gxdCe)fs)f)uEa7fS`tYIsnttU(oPoo++ywid16$xqZjn^i!X6o*zpeg9($DSs=LE~pi97>P z8ro8^yGP4hbVTB{@i?DY-vyp~rTfZ8Yk56fO6{C|s56_u!`LpKkH^f{55(ymjNE|f zulR;du!d9{CJ}bJLIjtpMA&{AQu_Z`I?JH8x^Qg=cSz9S?iQeEaWC%fUJ4W_P^7p8 zmm+~ead&sO0)gVCxDa<{uAv9)AS z{eC>7-|pxDqoJYwv+*L0>a`_qE+}gX6$tiEvc!&!VE3vVP-lFIo>;|bisghHurT@CI@d5Ty=x<1rHG8g#{ z2&Nuik>6+5aTg^?-AJ_t3s-|sT4Tb?Gks9zMkfXZB$dZP~?O5)krb*{rW=5 z@=27Uxa=)4!fOh5Fy(7D@DUr)jLXsorb z+#p=rNM0LzQI-Gc5o-Fna+EJQv~2e#tB+4d^dU+rS(TJ4fc}5v5&z33{r`=~|B^{T znCK$*Ieh;+HflJ<{r^+k5k?7P`>&D(18NLLj^8uip{Vwm8i@JGM=kHEW*y%F1POL{ zK42eOokE&QiQaaKN%23E{|CTB^jGDjPfEl$PJ51v{ZU4?mg5=yX%xsU@|b*@M{4BL zx6(@xjm61^Wg>~`b`@eUzyNzEb}WyI_ru+LGt?jkU_z=Z!J-tO-HhlulCMbLHsx1;U%|BW_;HiQtP&5sCn zv31kdb@zYgv}Ja9))>L&`?>BJuUD<r{))SM_dw-Wdw6te~}Ny9=6V}cbneI#a|`d7pq)rc4tuW%0qW0 z``CWg3nr#cHqD1Y1(PMNUM}Ia4F-MP$23;{& zkbMof8$0tkD3=@>@?&xLABg(f?K*G~L1RQ(_gP#09&xpNB>fw<@0;=U=wNUCUP}EF z0uqD&cxbx~4~pFUiXdbB$u4-`xv!Fcxd?uI`4?oE^7OfH=wI+3ziy_Z9d(&Y7Q`wbI)H(YL!l{mWZ&MXSOyzeDQy1jUM-uXbiDfRez ze$9(>K{)^C{Q~v(`<(aTyiqj4n^-4uLRZ~I{_ghdr;GJqNz)FDPD` z{_7-%dpoa&T&-wbC13qFz8o;gfCfNhIpO;nL&XF!-!F1EJwFf(SYteIUk6$uqDL0D z{UBAhZ6}v6@!QP|^}QKEjG4K+14T3Ik6&s-5J`*Orqk+1=sDuNJYbPki+fgCnuaCN z{$+0HLA-|FM@d%GtEixFd37J3cX>;;{f2M@pKr&#K8yyIA7n0=g^9`~zXWgNLo2&bvMoEmW&C5pw5d@F1XxMR0>_L3;-^5&@ z2gKF;1gwV@P2P3af%$sBZv6ANr|S`YT*36eMeu;T!Y>3qzE5hmz831YV@H!n`m^`^ zvNXIaf4h0r|0EV1MiQXyPCxsdU9@!DXs2|zseN8XbeJ%RFffR<#fPc4xk;Q{ zh&o=6xF0jf9~WBh^*3#!LEL@1+}3O}Y6enWyT0J4`s{9Q|BCZD6>&R5?5Q$CVOljn z>{_hyNTl^y@4^yJJR8ViS^b|M;@7OkyFa&{Eo=Imt%ghS=E!4xsK00=m9Zn0u}_wl z_d2zs`Fr~DqAem&_}|O*QXXTlYbtMs#(^c~jKII(U>uqI&j*_uLH_}osfJ!we;s_6 zutg+N@0C5gn0~H1dk(%haiyshe|_!!BNn`Ie=VijFCp4-gCM?Y=zD!BzfS%OKAU~& zD-FsknyQUX^prw+^3DsUd2t)Xn!kLeoxaBZJ3n?(cZT5lSIr&AUY=?9RX&e;^gi5V zro9S3J{d1v6g-E$yp?)a2LS%mMDSazp9rK7_}C-^P0(7ez)s-QOOGvp=Hevy+fYvb z^Utz?e=^#afuKzUpeDKuaqPN3A0jY#?G3(Oy%4?m9(;TCY<_sN`*!nr9Ye$K8PVhL zYhNi^Y6J6?DSXdQt}gTZmL}}+=ce${IRdFnx-YvwI^V`9d-?tPV^MhX^-K3Xh*E>z1#>FMX>0Lxn|tcOZUAUZBQ_6+xI{Beb6BCh#UBmCnTaB1> zP+1^dc*uW%UPM;MFn|+?2#-ZZLP0@AM&vd8|4au&q=UA#2k`#_9q0xi+gH+BR{xvn zfCNCWWQnj4wqYU9(X?9l-V=wO%~xjpj_eZ;Y}BFbC}5bo11La=#A9fKk?(yX`Yk)X z^D?PIMXR1!X)jnw+>{s7pk5CA4O&`W;6ibg)B6C;ZE zp<)1QaKlOWZH@+&NQPkh`Cg3IFpwQdO5)t~oDVOyWm zChGwIeXKC~uPkXUzL{zj&z6LVHNb4ld(4Tb)H&o_Mx;4xh5PC&*y^sG`C^{e4BsJJAEMP34t{1f-t0lJ zNw`}xd7@J(!B8>k@qF5-`_{GUTenf#{*2a=R4}AvzyZe(znD&Fw2=nRliKV;CC^-M z!{k;g+-_4sJVNa)bAk5T`sovS7HO@4BhLc8!ZJ5et;5&d} zEofH1Kv6$v=$xhttjlyOF&F(UV8V3IDj!k}61x6_2ZCj# zCggs)AIAzYvQxtIPVLzQ!@Se_g)x^{D<3d>_5_-$Bu5dD1dj-kK3 z#1E8VInM?|e(ZL9d;P#%dNk1t9dY@g%0alrvLLZLm7M->570aAY>o@g<*dZnOmLbz zj{sk_USQfcaPA0*+=+tW6D&hnFfNoV%|jtOKV`!{_lJg-`zSA;=^-G~lNg(D+c<+s zm<<>Afj`Dl#YhnPsu1qvnV|D*=s$Z?U32NB{x^kIzuuj?tt8WrJbbBGNS+nzfABWTa)DY^1NrE2p zPBhepkz&nDI1*ChS38tf=b@ zCTpdX;VcB8iKn zFiWxw2j{$ptaYu0qR6#{$-dS^?JcktQFVNiv15m!<{u9*B`h-3?j7pnSSTxs$=27D zL3z#-(UDNK%z<%&U=-AvTV8juO#DQKnJX&otlsP09dmlODAI9nWcD^odrXoSB%4I%T5H%N_!q$rW#wz1h% zjzia>rd($8aOUYiY`CdbXZn^se{TGTO=v|B7c#y~wZU`zC(;k%abT3L6`28$fBntcvWrVd9&mEQ%jqBS=7&czaj$vXJ<6GZtT zv@+r+1K&`w)o+|uWuMq3x50|aC!|$B?S>w?*{sNJal{e*id-dsUZ5s$ zPbWig$vW3WCqEQ_JSucZ4X2;T_D_@_hX<Q3v3 zjk4j!Lj{-OW}|9M=`^wZx2S~X@?W4f*pt|QH*}?95X~R0?l&iq)4|tK@PT_ zr8VzK9FHSu@hTUZXA@HNLH)B)_5Lo# z@3X3xl>&@7e-F<9oY~``JsPhv;QN|poC*!69y$TtDwG(7Il3bLqX9yGC5MO}XT|Y?!gFJtVK!tVGIvzL z3<1w6Vl&cf{$~Y6kG0}(MESfNz^n6%!-hIFv@kz0zjXJL&IP7uEVtkG3XEKLAD zCbZnpM6cBo&GrqIuHH8>g{DbCp5S(qEOmnHyE1-k3k>bSu~2|a~K&%HEcnJ z)fDXM+=mLf>X-dpi<<=O6V1QaFs_uHjZW+9wk5vDpTXd<0wUxS)C7y%lkP=Pf+$gb zFws=(rgDCr0rMMajo2Rp{X1oSd5sKTT49XC4s6WCV45=7jhgxs!ZHT&BhW z<5oelX5brw0v;rUa(gk>AUq`SYnb0h)(n3YQuD`HeN2mKRvm2}s7@6dghc1Gt?a9>V20K;t|sZjKh29kt@pZ^1wL zoWq7lEz_wS-Pjv_kcDqT~23op;EJ%|1sAvD;bA%oDL_ zT*Ka6Ve_<34xuh`(_orj*hmRPGKD>mt!z3ep5#K}8e=3luOaD!ZnPO`yTC~@%`-QEe$0h}(z6MM* zB-TjA+INSqMcez*vsP>o1(uliS|vj6rq27`!6c=CiVYQhui7i51ihb9%AJWxP|>u? zn)x#t80^yDlIP;nTq12~%eixsFL3l=I23YrcG+CfM2Avyc%Jh(5~jsQmk7|)l$Vjc_kvB9tL$FJ_ z>z7C15u~S~Y-m>+*Kid?nysi9`|JrZA&&?0&fJw}>o=5fw!4yck{HdKNG*J^M3#92 zTVhc+E#IZ@#X4om+qp4%&~6ui@y7zPQ}0FAHv4w$sgmLR^~j>u6T(`KCdvU0bGye5 zjiYvko|^&e(x+rCMX_`!CGvlO$_V0&Q4Sqy?v&8@tT zeY1m)=(TN+t|j9Y_JSW7=+D0{o|4CPjnV}Yct?yGEF*xC z#oGhe>Xttn&o9R%EL$?{g0opXp+9D{;G9iHRG=-d>+Lj`0DqvK-7xK#@!+10$49Lx zF2%f`#++!tDQO&F2TrBwXkXx(L%R$N9n2NUC2Yk})TRW-q!&sRk`+<4a8`*`K|E;` z4mc~$#BI&(TV}&W)=QRAPXn9)>=L62xQu^-U+5wM5Z9oA)c(?q;w>hiM3T9{s}Yt* zf?C@d=b|-TOIjH_Xv#fiw6e>0IW5Km3p=h9ti>?XKAz0^3*Wgq(%zZJ8fFiLMt!@9 z!Nz#+9!ldNA9hhhYE+st=1e5I#^Fr4KB}&Ro#gdJN%l=5opgRt0k!KO(f544wtcbH z4^c=u=Nn<3fhC%s+^Z`+mIU!c;wk;ahP2rJggmJD z#73Ry!vS5q98i|~6thXvF*!{p&WXYHt|>W`h|TB;yGIt?kwJc?%IV+=PL&VtmY(00 zTXdGQ>wLoob6`xeD{k8nr+27hEPE5(Wy$k@pbr=>$R&PsEheU8&@ed@*lLOi9dQ$b z<%qXwSZXo`C+es;z}!BTw(SV0zj+e#L@+%5+?!l&E%imMjPYp)rSA96`@W0j{t@9o zOOXAf_v_ai+L)Tx4TcQbKImfRT;IZ-9sjfJA;GVA*(bMG#LNEy%u61QjQeiUi&>o! zxyY)YPnua0gPv58d$L{>PuqT80XT01q`jZIrCXlGHRpm@&-#e&H)C=><@^U2Ci9RB z_^Wl(IPszf#!%5Die`+8aC?|hRiPkke2%T9{1Q+*J*2y+`>P(V|L-Lwm`t5W84!F^|xP4^G6 zfrd{%*QAPdgtn)9lXKOVr346VIcClB>MO)moU5w01<6BMenLVmr1%7r(`% z=Lb59+Um;QuVVrR+|N8OC8~b3Pa@!Bvy;XSv(oXJs%~m^O+1(div*n^<^#LDqdd)>`B^yG|Mc z8bTI&YW#!Qvt=L{O9ip`5AZCDPU$vt4*Cp^97s@X!cp$5pKkMw;wP-g8bK}sh5aSQ zi6!9KO1Iz&?~ciw2bNMmd#FfU)k+Q(emI)M%Za}X^x_UvPZe#y}l||8u6Dl{qvns*(z+wi`0ik~!L2gCBrN`mna$bx5kfu8(im#v4SM5=4}Hp}0~xO0-xJu7F7XnV z{|7i6?Mw=Oov%e8l{# zApgJ)nl^l)G2_DJu#D7OC$(hqZBPSvxXq1bu0dRy#9Z(>Yw9ac?*4n@SY$J|G@O8k zG@TLxmck`-!-5Shbn2-5Z&DDi<&*a)Z_O&gadY)16R|8ID%VVSbYfG6IqM3@E32Gc zYj|*+sP!|<^E!vE*whF^!b9UYIwt;7$5_H4<0WI)Ph=V3b3X;Y8?%yua5Q#$CL@ze z0=z&gB;$-F-y|F2sGB+9*1?{=e}!cHgfzP1EGEjEw(2YHb>zexnIjbKIRR}?q0X;B zewP~^<{bbPYmBwC8S~^zTpUI1CBLykIx5{l5tIMiaGzz_+|*-ub=8Pl80}P&H1oTn z(;gy!`G@GO-P?|U4~PQudusz~17hji0+NFB(EkAIq^xJbum&TuKhTKcYIlRT=VwOPW#$m2DI~Vk^)2@j)2v_{{XO>zA_kn-#na_;Ao$C`OAL*NCVFKzX84Z%J8DU zN@rTZD+w11;Wd9pla9y0U5gBDnRB^@swA1p#FNCcSq>CYShxZJkzrC-ib0*G6 zMq~WX^8M0P{PlQeD9*Ip>#~FajK#KWFQmo4UaeUrrFFLacqB-J9-7T_*hRh*pZ`^)S$@$B~pmnV3@n2@&&9JqPV#axioWh1>T`X9nTWKw;eI@8d8=!6?5{0uKJoZCK z1k!lY%D;`imGA5R?tES|gY=zL$Ra#8#@8oCDRr2bHO>>syRZ5#1=2OD|l5;G$$ zDQiSF^@V3TdM7@!(Ptt}?=8jy)|Kp%~KoOTkgaNR_!a{}z+R6+&#(s(K0du0vH&dN- z7#H9T#f2(5pvh`wIrw+XPih`<%~&|WqgTiW&OS|+&4 zX4@-ZS~TRYHID>q=J#qBZ37hu_Q5_NIXHH>ziI(T{FHO0U@*#3`C~nc{SP@~H$fL} zy?7-wr`P%{*9HPl;cxzez28|s&1y7Fo1EKl;?f3`S1{D9Fxv#A=V?~Glwwn4R;XQ( z)3G?p%QZ?e;PA1(GnruKz{F)|J2B+3X<M(>l`^n1q*`t(ndE%RPV+ub)+Y8Tq^> z=Ctzt161{YMpbmSQ>%bu{wyCx262Mo zQR}m0>J}#FcHHn1F?)AHxkdVXaTS%gI2lZWZLKK^qc_=%s0i3}lQ`w+!Sd+_lNNACc*E_bV-k zxn#q*CF6uf8S9n%Y=^IeO9wT=I{Q~+yb1)QpQcc7hPw5rR**u_Pu-rMl>4(s6nJjJ zfb^xt8l;I~6+BbHs)rT-0i5H0WAar2#@KVB3c~H2(URBa_KVH*O3j=BxKM%RWXMd~jR+@NjTojz zz@JDM_NkMdLeofa80Oyx`VWWnaR$w-LVLLH!t$JR8StV@=*K@v&dh48ATY@J5+B)xGZCJNa8y+js$Fv zxb#1!^ljA!T5_t=Dl7$P=?(?l8D=J>+LUkVnMt#lgVWZ4BG#EEQ!qCg*!6@mdpnC? zM4{`BkjJ56>Fy$!93i7vUC;}Nu^2R*kZ)%oDKYBx3be&V75a+(&~+DcRu~;ncdSiF zW8@y>iuG$8Mb0~Tp*Hb%Rd05pw93G@t~DjKl8TMc`#4F=s^!nOv8i3Jv*G+}9UeB5 zwh`y`U(wkFvEp$spllxnS|#(Ek3=HXAF`4sd<;4>F@Nwt=a>h%tIA;Pkwg@3V&Rx% z;tSHE#~cHL2al0)No#ezAioKtT?M#h31H?iNQrXXYX|vyAe@Fo-Z~w|E}3eL-nSk+ zI+6jyg0#1|?b8w1Pp#$j-bNtH=K|ze5IzJWJRzWv{EUOH%?(%Bt z8qiF0yK`lhAt!`Hh?*WBhp3kA@z zbnXQfHq4=S!&|^6W)vyz2!N{+RmZ`IouquUf**o2j+TZj0pHQ~lrPxvE|_A~>rf>I z5t=X~qGw9v9=<9I;zojt75CmcQ_Wb0tzKXh7rS0xmSmpFWg5hKe>lReS4Sdua{K|y zel`H$I#+X;wj@^kB^M|P-vRRPzs60Y1Y8~t)76b93&$NW`WVJM%I3v*` z7!`fAj5uL>xI_+R&}}1PGS5aON;%vr&J;BreU1p0$cnF_@?vgu$S1&o9!H>S$OVK6 zTlaV?DI`W4obA{0hP4ogk``hVcv!BYxBK}fElex$yB6Xw&_sM&; z29DM=5V1Z5hj@q{3l0HH8osg|b71dY@Fkw!jiVpwV zuvcM*l-?F>pBqD7q0`FT^@sq4;D{%ASpyTGl0F?8X@*J9vkhoJA`Kt*F%efQ(8GSn z8VXK^LQS3NT2;^r1T;d)2$RpZzUzLWNBQ{K(^-DG-m5pWVw6y<*|}yM^VGYzeDClWE~;VD@O}r=vfhjkZVig}o4+_aD}pk~iVl0P zhn9F67GOk?<#safNeCRve!b2D8j%VJ*N8IcANj&r{qzte!Py6Hy!iQ8LS55@-VZ{c$;Uzax}X#^&_p8h7jDUqD-7Sn=93 zarxBF+Fx0X~!&{h!{I7E3OmFMECD({Ke3ifME+x_(ooT*co?dC~U-k z6<3LbJVWG|+U?fsO%=vmNzlCHO|?Fl>+F~;cuOJdLM?#&Pce3;s)6~LdqVm-e$f+j zi>ukGkxQW390x(D!uus8A%;Y3x+=eSung%;oo5vsX3TyoI9j!~p-Ie1tk$eK^PNgG z{$Dz)AxCPW-(G3EvU+Ud4vq}5CUB?K%mOO9ZU0;AkS(-BHKm3)k2k-pLQ5js7glVo z*o_D6>faq(}W3kPNKfB1~{6otpY)(lpXx3VeA% zMhOtNj*J4&s2>31Cy7y=s_J*J@OtjzFmbics7qERL(oCxi6=k+WsDcf2Q-3DD0n;y zRqz%++DdjG!xCH0^g8yT_UX(f!tQe5hk{-11|Ge`@5P$r``;DWlm0`#q+I-CAp;>C31ckDxVz} z$_gZ#!NFI3g(iH!Q=r3X`9z4_``{mFc*Yaw!7*pd2wN(Ulkv+mfxGFbTn&&b*z*%> zsnDxw(VZ<=rHrW~PY!AXHyYmR%Q7ctAK^^bj1!H75uTL2|C|oCmyR!{{=@Lw(W!OI zN;LjLi)x|6wFW-Vi>t3UQ&qmTsn-BVyh=eRgXs^wEt2Knczb0jg2)MqI{N@^rF)gN ziF%CgE=*^wMsPXOr;Ici=EJzzHoTzkv?@8!v?Y}Y9VIv7_z`_Pl+PFK9NRp{y>JX8 zx~encLtpt(mwA53Z ziqWdL&nwJ|;a{>WMJx)`HD^R5DrCTtfbeb*YOU5edzbm+R(j3N+H+8j8i;)YXXpe- z6y0i8GSN?oLi=>skr!ocKM(ih$g}3-a#e+qw-W#o*)$B;`|w7<(toqDC+z+#6$Our`kCSwQP?1fsIdzV`<`k@`MDW;*jXP;vrLSgo*^rzAFDF`%!X+ zJxvwVhl||TkvPL~;#{tq%Il?^3U5q#xLu zr~fR6w}+h$sULEfN7AizFryRuHTV=Kw-C4jKu4+@~MwR8MU{K*fG`1J9oGV%xA(E{c-@>}h8n>Xw*u}1LW z5zj;{#s%cv)LT5e5Q^;V`K;o4N7WyD80cOl>g^TZwO2C8ZRyf|^j~(!70l}m;$nI- zupisNkV?p!^$A~{&URYHJ{`j5U@W_-e~>#E%O zT%RLnTgVS<>jBJJb?ZtjnOSBlbkg%YCAprP8z9?ZeIA*L6v7KN^puK)cC{#|yMmKw z%mjAOUo06H$bEbP)RGgOV~J{R&jh(jH1`}hhN!@;)b7A-#H_GXuo8VC@-2k@=f;r6 zW@^koM)v-L`5aaW4Ku_$#Z~21}^4sVFSlW(T7lav2HbKGQ4@9 zV1Wtxu`eGfV}}vFl}JL`2K^t*2AXo`>%9aZIPKtlsAEx9fwfggU7=YMfpXL~q*E;$ zc1!a+Q@0H=9idE}4;;o%O*u_M=cTf44jjz?U;pWKsX*hK4%sP#C(EhijmZH?Faqh_NR*9r}hQhuQMP?jRvfMI8 zKb4o9uu{z>O8SkC{1s6wX;3~om9?VFmY!9QjyS9g+EW)vBSo~9pgY;ahS^UzL&zIp zm9J%nTwyID+F-bq!a~VmIy3&Tb*ya;s^ODwAde^bFOY7y!-^^)*`yNvKE4UN*+ee% z0vX|K#!%)$Vx!T7cMCcpFX@eIA%Tqy9{x=tr)U2gA~M6F$o^RNn8?3d5@eOZqH^zM zZxBoiE7kyjugI;C!^-2{)$7u7X~=Z7O4=ib*!>4^>iLqFrka#@4Mlb|{kM%z@7DI0 zpKZhAG2uNN>!qnMDnyJt&I)%6`sSa?_zf*=GwavB#26mm^$5C{N<$srPz4FU_nLvx zO&wgp=;2>KH*FI9lTWa@^-}Ih=8`dB<7o1Pl0G*FlxWWwLZ|qMfb|+PXw94@=+VhM zTuArOq#$t~D*|0UhWj6W)=EL>>9#-o#m2UZnjHFz{Kxo(zg`#}eJ6UA>|eo#C)Q(5 z+0>&lPTN~%{>?&3rxR;+y3zK=6C|_3!H`Ju9rsED57a5bY`vc?HRrq{ zXROi=qO}N@W3_g$Gt5&()<%QZ;&Nyz!>sSbB03=dwqp0 zXDZdu;uDPX#n^qSIMtGCa4e4eBA3W;nz)iWzRCw^d_TEa6EJqCfK-wHo45@yWP!3^ z=05FOrqROMiV@Nz%r)jOt}gQYv8a^E4hL;7dk@(z$7Nv(Z9*w3BYs_4I&X$`$E-f= zgPdcE)ITc-rVevFbx~`Rkx#>8WD~>z$;W5KpNS2);v!b7{HNPKjN3-6MMCQR9B!4g zF4kNaR0DT=>y2*nO1G>kR);p32ShXYaRK~IY011o4>vSii5;4Sc5-^3R2&DB4SotbO$+JfCa8_i19GN|gVNVyetHWjz z7(3FDYKDZ?=}f&yATGf-bA>-KLk#2#T|`JfxD<+U>V*a*^b@VbN#loVhAXSB*UPoU zR3=s*=zmH|P=>G|hwSL(&!NZdH{C<;!yyqxJ88G6do(|9aoeOoWKxjtnE1a(Mh8Mk zD4`Xmmp+a$X&}tPq3LC(w;6>82QCObB2Yb^U4PmQV>Z))5H4qI^tz3$Mb7UN6&ugT z@SdSHDrk0vW)c@~!X(oW6)S4bgC|9>J1}~72JO4uuD6^rx!6M9d)0musfCK=W%mzb z>|LP@c7kZOZw;!75z5NohgUZ@=Gi~3rWHe1wC|MV!)Kcl57lAG`ZdQ%5+{W1x!}Y$E}ScNty%HL_zBSm%lZJ~AxR$B#*= zpFJO1s#RcsH;UD`_<%K@k;cM*_1u*0Ps88dNs~^18(sD%LeK!RqtgghYN?PksSBo0 zjXvnBn#t=wx}fEAXOH4&@f96K2B?mvPovIxd~yjP>x$;vT_vSyRu1Ib zRsbb-N}*x28e#6pO~@!^n(SC`L-briVTYj&;F`odpp1V66*nw8q5~FZB}c2=jYLH9 z-Cu!75A$i1o5c66^ja-u-hw<}RrklJt3_93-HQ!ftjp0qkoZd7fsNPEn~;KTglcel8$xkZe(yAD!m?Bsu&+1%*iMStptuI~!t`!+(_%=^g-t~r#TFGK zACudDn+IE)PAAtf#M^a)$Rpr0E&q>$o!a=|D5Kb_2 zYScxphA7&{Ny*$eRS?mmd4FVzdNft@(HRr{F65>8_9i%Eb3hkW$t#E@G9hg~_-mWm4Pcax=$ z;DDCvzLEMeLyBAhT*s_33_Xn8MF0bIt!hP@{XG~-vvF+dSjm6EziJ5#3(e(1InDZ_ zy88u(y|&l-zTX=9N%dWE&IHDo{#ttM!sHdu>syu%E+1#~vE(;*3EAx!Lni#YQ?HzV z%!$=>$7A?ErjG@`0%Zhu%ymfr`9@#_6on%e*t35L%d+dv@;{F_g%w?*$5qRbD|(t? zTXw{=i#TKSh!KM*mf19!oUIPRPoKQYlwfI<-91Hpj@=7#LOUDAA9z$FkC7Gfd$_uX zndtY2c%OlWS_lm&h zuxYUap*vLQqBoRs_=Ww38&JYkqwE!xW1`OHhB^kwo`pQR`5avNu5U2C6mic>VP(|>u39%PC zJ*muT+;jR42`NrjTC6U}T8Pp#=C%xdvuW z03=z+xY6z<#+Tf}88o-;fuptKcmrwpN3koVf^Wm@-3J-n!M_#Z&#%*2cqDo&&HQAW zQfg=?d%kPmEE1C=8bu352jL1+#BL4!2MG25230CA;qcyyQY=Otkcr$E{sRpB9`&>D z4F5&D93ro3Z!Cju9H+fNY{KZ-o$8drA7#EvrfwOAjDKs1tpA-at)4oJIWcCBy+vF_ z)DL1{u#%+qAwVjv*P}) z{)c?SRlU4y$ji$k!*-QC^Y-625|G!O`jOa6Vod#mnW zw`yvnr>AH8RQI0gbDr~@k#`cl7odph-!a9CvOwf7v?|plPJ9Gm>5PbfLu7D3cH1t6 zUVRI4J-3$U%e-UY@6Y1C$}p~PxT7qy%B*1bA>&eq%E*s}0Tht_pe?m{MLkJceD`=0 z%jNvXDOXG__~3RQKAvFkL@l^=Mk?W8QV=ym2ceJVo!$sEKI1+? zRjSb6Nfo$j5NBS|RLo9{jwug*>J?fcf@l)Vm@3^E(c)G=B%oJX{x#V9{6%F8K=VVRi z2I3*uA9Os@Nj&l>R&|6)rQIPy3ukHT5R^=9#w9*M`pke~#_B$P?S{>fc+M2P5FaA~ zO5K*aJ;N*gYEkUq)IqlZnTFnF)BK9@(WB?I|M4nK$iHl0X7-s~lT&5?l;v9)0MT+7 zSCc^5C;%`Of;L-|prco~i2`g1z6IpVsuGjTNLO||4+9%H$CmcNgNU((i6cRfxF{RP zrHoBv)tyY_W}@V@04Mgu=aDGVt=0oIY~_)QtrhIeI1uyXnkvZ9^}*dwQ8+NNV)FSSrqX-9g;%Xo zHzR)j7}`{IVfj~bV88^8nIjiPMBSG|+EdEHEY@ObjnwFn#*$CgGkU&c9n6jVa8j>j3eqtyoXqY{sh8lI^n$aOCp{JK50 zo~G2a_)tq6X**aUGWNK?c@658UWQ$31eXzWl9)*oawMsun{)}DPBAs4Kk6@(zSovLn}vo9#hR_N4QP}U9cCHL;}H*P8dBBOzr_yh zM9Nw1B&mr=xT`n=r&a8%9QDC**N^LMhiCg4|EbT1up79X6h(yp+S zy5uOkzWBWv^Y`ksy9cXvqo(6wfpA#H@(uPL781nk1R$6S1e!?srK23?Mz3f{q=J|W z!|N{fmyQpfq!;Le^(q-JxUSJ@bg!VV1B-Wf`Dw~}B38b9|de9Pnc0|rCIs+iijkR0s zttCp1n^I|Vk|;5>v|B=;d#gyjn2%%6*yXt5KshiMTMOMPzHO%kW@NdX&ulq{w@LFW*^+Z9qwspq^r z!vH!ZpsH8*7C4E~`SV=9?1m$4n)NFY?wNF>)7~QIHUgWTeZ7x375D_%SU#9l7fMS1-zKE(s2>3t4CK?^L??Gyedlr?ADa zpX*n`tD^Kq?r)7eg^A{w;wiCfJQjc(zLSF~<`5PckbX4FTY~8rb&)&829fI-soKN! zn!&5mS0iOEo792bE?-4UIn^XD?B__cbQVM|dE`Tmoh*DkNiC3p615jabH|2YJa^I! zs|Zaqm(M4Ug&ASx+q;;E0g+NX+LiFtaFrdDgwiA3FcezVlvD#H#g>R0#%H#^z9=0$ zkwTn;!UdD+2~`8UZ-_G5JRSAu7NMBVu+-<}hG4$?xJKSIE_wei7Xe2iJ=Whi%RV2a z2A1H+!PS+{)GtiC>DcR|wDET+b>7Y24b`N>R(EJvEFj0Ot5BxcLOO=691+ z_YL&EtdxG^tHvbG?zFI&jLvK>A`vnGIdAJ~Yr+^vbjI&y(4qFJ@z>euf1^jlb&{&M zi75U9c3_BrO~IO6je2PY18JTst1P%rpw6yA72AqW2d`9^N}Xj$-c`sVmbq;Ki9J=^ z8t4gaQEo-r4~KXk6s`@l%x6GeL%zi2blb1sFA{5nzyLT4nqKRw>s0{#Vp$=wOfybT z1DiESVAC77Do#_9fVurEcb7s1mQ7M&f3V5bpex)0Sd)>Q-akf?DD%&gv?MZ(;$Tz# z@X41XJk?6XDfneU^Mh|dJz$jll;b}DG#jf+3uCF(DEsdB2d#DablMq9IrD;+yROV* zb8XX?SK><*O;W#*ARP7JZWZ#~&M+zjnX;JBU{j4LrNm~I)Kp?;DE|>p|BKg z1Weq;Uxpt=X>D_a&#xxTt29)L%X53;n zhz3hj1k0ewKv|VoNi3yLaUpGLC)N~cn;QdzA<&wE$Bf5iczf;WsQi~khQP^&f#@OVi_lvdmCSWcIk1x+l z`J~d}c!!NcBRu;aPc+PO3h@k%2tY==gUwahv%L@H=k?%{iVj=&K=9#3fsQNYnuA3s z1QoW>2sg-_djB*xh7q3-_^feMZ#NL--*$tzywK(9-|N z9gikv}0t1ob;xQKpwZ5SCqzn2>y<~*0^2#b9{>6i% z+aRsD42#W(c1+I|n|(6e+k`J63tgP%+#>wj%g`>q4u7pEk>i*18diAaRNxQ~`QI1Zj!PjAgN2)}phGT@j1=C?g zqPpZC;P?3`Zus@P-Ac{tvrJl%vR+=>g=q@*&LRj`XOjq;2$SvPuO&vpy^O_4{YvdD zQ+p*!0unp$fVSN&2acQ&)EQ-|L-Ob6_c%MVLWTx55)CU@kR@Tt{nXQLU+q%K&h9*U zWG07pfwq;{J>_n4pG-;TgdE>(6~cZK#f!^3FF z5v9toMViN$&sJqftlp`Bp-CK2Ayi3iNas)$t$=QD5JSy0d%=a2Xt)qm9+Nvy6SvVA zAz(@3%*DaQ{z0Nmqo=h?0ZS%hva)9lovO(^hnMCf1rnupaZNb9UC2yGo=R{g?mI6fBh z$;V*3A3fI8{e~ds?PWh_%~#r?U_-%(+)JwQ(E(DM=sOwp963BJw6>?x+O8*f#+R?3 z!zZg8$b{=z=cEqHt>_cP1lB@aUC8POyjSS@yYxKiwz;|tUukUiWLoSzUk*dfwO4AVSOHC)l(CSct0>j6|!Yp zvDWcCFF`nrQm(Hag1$3p6_m?o~^_7tUx0xa=}F@M~>ZGQ}nj)}It>{cS2;8USV zF!w#bLInVz;w-y6WoWd=Oz=BD$VeAvT)|4|i*w;u>>hEp3865V-Mvq1M-sS%dpuMD z&L$RFt9?FJP3taxhP>j=TSL}#C5(GOwmN-D8xx6x_((w0U$RPq5UIi5g93ozVDlDE z`q*jZ)Oi~prSSdjqi`B-z1Fya=vkZ{ad9L#1 zkz{U=jRD#>5}H?*&feZlvt!hUHnRknGSXJH3dKDVc6)>um@tEK8)Vm|3S{N9=FP?r zCepnnhZ_P8wdSfdeu`e{#m5hvjg0B6`Y@gzscjLjs@J$GExETmOT6!idmz38piZ?S z?OVF#HLeNtO61gw4W@uXjW4V!VrK3yTzC77$MpcFz*dFt z9pxI2nRG?ODnSnvmw+Rk*VXG{9k{@hKua!Hve!KLp%lYpPTGAMrL}T{jYxj+WOUwQTAWysj338pV*c(5FE4&bB|P+o+3noj*nkp z!Atr1H*Rl^K_iMVcCw)P`NvKePrumy@ykb8TvPrH-kVv_@ce@hj5FlFLRkH%{HvQc zivPP1Rx>L9=H@LBR`~e%55`!v$MApEoc&*$V*hWOu-DzZiT?i|PtP=5>eY}TO-*L;odT6C8Cb^BwIXahZ3>vJ`mg&c!wu#D)n>vSNQ58mq#YcSJ^4s|G) ziDt_-TTFL*;&FthA>@KgmhdB5raGET)!-zynh<Zprh(rN6tAeosxo>T{*S)^tqXPL3c+usd6BL z5ZT6M%#48(r2BpII>B2=TSl6DVt1v07LuSFX0bAJq9W*B#yi7Hy#jI9@h;dLR5?Ys zFo+z1scR;{Rs~I;Lgy!7n&rsSj=LL?u_-}|Vw*sT8@id=69Ln=2gQKUnVHf(;Pwkd zgF(U>06<25e0M2OCtOtjkRc4{HN??}b0v)_*XT`j+WW|;b@r#E0p4u!fMWnR)%u~P z1po^iO`A^^0{w1UskXbmdBI0?#+^cAL9#1-Am))UH0cmlH-3P=WkyI_g9;63V+-v^ zJX8jo!czFZ86044TqyWuzeBwdsq4Q${|B%?;t9~zEXVl=aEN*ysWzs;*`7G!GR(zS zH|9nZEuzoYWnBKtFb58cs9xnJ^sB7?i+g>)P>JX&H$FR~M{~?7`b6|eZ%dfDv??nj zkN)K`7p2lc_AHytUrN|}ig!}~YqZ38s@aFu3HjC66UwPz_+PRL#d88?eX36R8AQ(= z{eLX~0eUlG%yVe)${O%N>^k+;F;mC7(*3{-^Q!-&WMgYh&PA{~jQ|boO4( zAxcbW&d|)A0qu%9_}nhjKvax%d6Js%u&it&3+G`LTx1I(>FM0_o`@ta48uP}!P086 zM`lee+V85X<&H4J)>L)U$#i3@V?F%8IFTi`1na6Kj%c(oYtI3;9<^l5t_=L!zmtlv z4Jil2;LPOmt*_eaHsXJs2VVsKY}#ViJazm_gwRDo!P=1l%+qww2bLDi3sCan;X* z@A1XW)XagjSV9WAG!3TdmH2B#S!^oejE2bFTx^nGyPif&Myo+PHLdYVXhc~DaKwyd zhbVCdUKr(r#FIo5KBp`d(v5;)UnH{*-iIT(pm>0m7)t6t>0p^mWTpnM;DI%WLuHh3 z)WI5S)GET_C6nyDYCHn;mLBSqX4-Bh=ZFdqX-4s8i7uw06ZWvtWB272lQ(EHXmB$? z*DqKyWN<)y$)4_y+M|Ae{LYg8*JX(VR)hj1#Vs=RifF?^y(Q?olLSm?ybsw_J5p9B zJ+p4;gb~Fm8Cq8LR2?xg`@&tNvO2(CGJL~L=+%VrF{&i^q@JRn&q7VpSvK1trt6d~ z6a(Hs9AN*X(!?jXN7MRa5wGeZ@9}M4ZcgO*S!O5>Dpf11v2MyX?S@82G`2KZkM{P1 zlQ)HgquopwnM7;hmwSkKP#RKDF+N5cGL9Rt#704nJhB_iN~C=}Z$mmtQbG?dGo;QB zB2o*lh+=cJKt(Hl*Kogam&VN4C_?OU5^NN=Y44iLtLR0{l3-F?5cVY;sF1M%3m^{uC z@L99zE<*7N8sS{9LIzF?PGi$RokBZ}gy+*MC7Bu!lE&Gl;wDSPZ6oAvkt_}t+3%8Y zC_)+yD;PrH$H19g#vp*{k1jo3tGyM16NZ9#l)eDQ0k1SG5fP0KQI$Q_Up*XgkQ=IU z-V+TJ4!eB%*oq)FQL$Ma$(36{I-2#tG|hJ!_z$4?Dn65f+#R$c%t7Z3W+EGAm2c6h zre)VVEp10CrjuOx%wwW@ zi$T-z1rtHftgAFtPN|rp$!?Hih*s9(SDRp^T7NN~=EGA^gA7`$VyyCeLzWV&!G4IP zF;15NykS-p_-oU1|4~um$>=blsR|3O;3wIg9yw1-2{?~vy<%kx6f8OM-627nA2Hp< zd!T5%mG<)u!Ty!1AtkQPkpry-d(|1&I1FE}Ypg06KPmAYGF{Iyp{WJoU$C(D{Cg&; z?6Al$^6-)$-=lf<07HxZcsugJJ1xODO~}+%GXwO5#`iRjkkLu$?UjCLj0yU)*v7l| zPWkvMQNx|~Oye`Pa-5!!9|&aIp&uCJg}bZrlWub{!ZlVL11<4dF;x!8eTP)7!S~E2 zYnGui+*$k_1WR9p2c{4@ZjgAvnkN0$S54s23t6l!hiU6Nmu-zyN3<#Y~s2 ztqO3!?1`FZ^AF(M5VLi>D1dFJ_z)te0wcnMn|@Mc`Z~MoouEM8Q@7cfa9w&$8u1Qk z0T(s)8FY!YRC|3kAw5JF*EZN)5;gLG?_$WzYU0OHqp0$WyHB?ZfEafYbK!A-(7CKM zXu4uqtt+|oVLTYq0*17MOa2+%-i_?|limhsmQ&C2W|?>aF&qWYd3ekS4cV`pq)!-= z7f)bSgKgs@xGMaFA;o7=9^$1( z%+LlUj4+bbbs|#sVGEL_>wqBcRcRncA#QX#e`lUd0on|K(qvvD2CETX`RlZCIdOjY zfG*=_Dgu8P!*hcMx)Q0;x6QP9A6%0v77X{X8Z*7$=^_)7iy!RgZiZY=h%+IkJFEWy zqYm-5Wh6)#LQgjA)_k`K71=fO(D#$+(oG6&b!0|MBp)f~My)~^eLE{PbEi{wZuoM3 zox!-ykC^qfsFA7#bX*_i{sFE(204uG$ATDx*^KBWlG(-~zuIwt@Tl%4-ExX)LlKBe zjQ&%SNUk`JZzgQsl$)%2d%B>8J3%ne|Lfiuj*g{e*-}cLs%3LyEIVUIa7eCFcE#RUVV<7LmB7T(bk9a0D;_)@E0-20O?b`D;7+aJ&;I;&s&ftVq zYdE-Iy(`&t^}>!#LLw7YNas=WdinD25$q4kY<>~v>?208N*y?Y6gksS!nN<66Qi-<9^o6qp`m|mV}Nx<5Z!Jsly?J; z>2QdM^R8%W-@`5`QS#iLPaszlg$pOL+?Gfm;M^NfH<|F zA0D4aG7RW`rgNrWEl;#k=!O^V5!?{mV_ZAcbH;MdosMvhjL}f-wgWgUG@4nx+Ctm0 zOTh@NE5B5`zh#B=aF~bOPs9?U12m0>khyM zj+b-Eu7t@!d(0URJ3WfG&z}f~2TOHfi;~cdHh}clQeR%&)znn4@^$R%c6h~^d*Q$Z zMrjM&rtX(#Y^E;*6LAIIsI7J{V^{NoU74}@mV88AQ#0Ow8mWf*E-!uU%?Sg_)L4=> zY`*uFTlC#nnEK2ZOlPdBhN>g$%mmZYj~g{@GwQM4D*PEdaL>Euq2*J?-9U8V2*)mI zL*Fj>JcmJOjG(&jjSM-d&hwvkaE0~0%q_<~m(huJ|7q%FUQpDI&+gul*o(N-|F}gZ z>8LWZ)U}<6lO}31Ucs52nFTd(XMj>a{ByM`&{J}^Q?bqxEh^k5t-vBa!C07%7Y;$i z%rVhoJ34_>?3oQ|;T}q47KPAO+jXnE5}FV(Kq8?H5yENH38v#(QUPSO8nv=srixnD zw;GM0I~=3e%V4%5xW_rm#4KwgRAhZJ$q5`Jie|e=!+OCQH%^pxx z;A)`qxuvotF9(~4lFG{P%*6>H>{#rOw(03S! zQZ}xMeu2(%s`D(G0MZCqmAL~4o}=$DBUqHRr%DHN*MlmMO&jhr{3Aot7NNxbt>Xe` z77{tNIPfN#ls2b-(Mhtbs|(!?DW#4af_uxDUdNRUdDyXbzNi<;ly!8NdiT0w7Z_S; ze@HCsXo}>7bWXAJYLj(aGR+hK2vm15LRhA2))|3Yq>*^+ukYmaz5$B8_UMaW~}J3RV%3pmQn`>B2dZDMpr72S~s*cAN`hPG;+oZro6ykvCdV&3tBMLuX&>bycb#ftmM9{Jgwg&U!bbjYa zuiIkSP{Z+C1|w0ncT?rwRA!w1^4sMr?vJf<0>b`JW{&~kW#xnyRyIqNpA60n#+ysU z)x!{cS3DLE7zv0=(+4@CM9SDwUqP%&)E69fP|&8qNBGp9A0_r9v~wmR`dh zYs=)AO!0WR@Zi~aGqxk93j4oYTsRAshb3PTvE*-!NHgJ^$QM_pIK41AZlqM$?5IP2 zN=%Rf{sEE!>0M$no_J0=e2BXK5;Km(}O=6lOkh5Z$0k$h6b1JF)v z!f@y)E{(X&e=uAXoH#rJr~p8T0;qeC!@v`cW*M_zSqQ^SA3oKIupd0jRb5_IDBJ`V z{OfRf`kXSS0{o{)uXkXHv_owjviBXeI+-nX~BU3fCGG{18mCLCX_ob$}6tp>KKPzBZVa22P4qWPFTTYO= zA5H8pElw(%;^IXS8k7S_!~EJW*#QldOxCa(v~&_6sf2~$Av&q5YXx)ikgqSn z$eBoz?4de|_b5A%ssc92rZ5(eu>y^1G#YMHf6KrP=Zt?{KxzL5GpkPIAL>bio#(!7 zqIEjbw>lA!-Lu0+zhwDu8TA zsQNcnwO&3zt5v;X|;FryA^|Qb0rkKszK8nhe(w&ILz)0?U^^ zcC@93zBVhz6`N*J)8!eP$sPY~kx$W3-!(MsbGj|mYHBzB=98N+vlemq3L_e7+Xf5T znG8k1BZ9?TlZJ>v12#4#oHzzRRRA8XYX<)SR5#PRl-~Nnp@dJ^qS==Uf7?NQMnu|R zM1_{f566ZLDXF=f{RdF)`P#_(oBFlsa8b@=gz&r`PWo?d;w_$Qagbt3DO_^Z$)Ljh zmlFN=R1B(-WQ6Kz6#gNXo%Do~0uQdC51Aoxc}q_a-T`7F z2Z47JVm^AMMna{BPc`E5?J_6gnpD|*c=!TcWjt#@k_fxZ=}a|8i68ahE*k6&rQ{WD z+%>3u6`z9LSjaxy66EA*Lr!qKHzsBWm)}X^qPYnlmY6z!qhs$dVajxwnB+>rjnmDY zHU8^oK+NfM!=x}KKog?Qg%~fE4cU?Gp~@KY1s$K( zGm8CXcq1bHQE?#LrZ4R?rv>082r$xysr$mGBR7+oZa;tJ!aw-*udGeI7%Q?wdw{gNknFdK4N8aPNb6yx!R-9lqWVfowKtymCCCm|nqTAOXxzUYR>r$a)TC4uZ zEJz|ZnE}T8w!W{M`7rDq_mvE$w0}%LHSrP` zZ0#kSJVLV^dnT^v2i(}QwX-ju3Ylx6OtHNUg6|c6%wb=jbK@!U;xU^Xp~M%8=>qk z!m;ZhLo|alg0uV5)Oo$ZnNi3mF`*A3u7iQmHf{(DrXcY&D~n*VSbco$m~g-bY$$Mj z7^8}|%yEB4Hm>h45s7G$UlhS)z|j}AqpgKojg%VNH`md?R|!G{>5#2x$-BU z6_#)UCYe3@8aV))XIUArvxGOFmY7O9;SvRd!s*AWRK-(G2Kf(J>qbUO z~I1prdKK_?wN;vjO9Q93=5=9*z7 zka?V!;|$YxE}hn~QBmQoS_c++}f9)89WQ3yX3Z zHmckMsihL(7|<%K54GBtf{7WC1A|4D^TmE_HDeG+rYS6&Q5WylSCPU}KJ+oJlXzVP zL|u2zHBy6wi6JFN+zWUo2alI885sk*{$Bg685-@HtXD@xVMBJxK z5KJ-%(d?r3CgCCo^0%r%K3sr@1KQP zPwfq8t5#s~TYsoj7{5Wg+F#Aw??EB04oo}8i&%urja3h!{{Wsp#xi_ZAEoS*^X!+v z^v=v(?x)P`MujW)<7Mx6iPg7N)`m?^S3bi6K;fO$a^lKLx%{#7+Y3x;3!FA2TFH5_ z*9ePmv630vz3O`B7TDC>;p?3!pJwydxyo##Ed^o^NDx6T4{$|0N3_GsTLqwGxxRk@ zoNeW27}%-}F!=}!!U4@x4Q6U|kpH;EaltE*4`3x03^`r$c#=d50kGn~{ zFp>ZiS;IavnGcNfYy_s%?DNYHY-lIB=f*mzI&Qm^i4r&)fqfyqbflYkTUk(^49V(H zQsklf%Z6f&fnL;vQUT^(9BBy(5}2dw=RJ*liNdoOY+&}895~1Gb98ZkgPcWA_(Zvo zCe$<(s~z5tXwn6|nC4lGL4T&YEqR~$4_gcg3E9=V{wNx+bpK6ZLQFEyG0G8LETh*n&SUF(crNarlfo8WzI8Idb_nrjSt1tA zK>O@`&o92@vrcRQ`y@lE2+NPl z-XibVF`ltdZ&7bqgW8uL@V-(?$5eG&2B-zD!GxZwEVmCkgyWPLp8LGPf<+cT@Px1b zSQwCP#D;vUxL(Qfy6a5cRZTts9oRyRXD8{wBBR6MwR+RWv zPM){)i~ahv{)_-5o%`9~gGlMQPTv=K*IA+640YtjQW9c+UpB6hY1MB{y&OEk*)kMG z9eZb3CetJDWNn^EX-c1weCZV z%O6lu$E_GdZ6j9-njW!W<}cHq-24xqRsVz2g|njD(8P)Lt9<$j=0oq`N zL2-2%Mo6H*;3_DZ_d}+N`TBRjrCRowc)&E_SI+K0I?^?(u$6SQmJYAWe}GE)h>z() z13GIwB*`PpFN0_q0p_WL9S4b}hwF)ZhmWFFO{tMq&4dpyhOJQ(5qQ&6CC{n$Q{%zG z$sd~I_h^mtdrz;tTAmn>Y12K%@AX0&bVahxzRWQGn7{H;nDBOcoeTbU?URt3l&HRf zw71pO{wm=)41f!z_#Wp(z2E!{WkLv9HobcjS3#EUh=~3z0>DAJn(6?P*0{N(;bvsR zB&0TeJHy>9Svq?z$RO5hCCmKr!fZb{G2Jk4Ro6RK(gSIXhWIe>liAX+bE+5U*}x?F zod^(N6b-_2suO=3hxqqiylguQ|i7Hw#kk z7!CH6-UEZfq+LF7UHs%f*~BUx$d7eaBN%iIwsa>(;}azU?6eCZ6yc^PLk0nwJS3Sl zP+ZYZ&>hnd+kuuF!OR<2hdc*eW+9++|tt`4A8;+opxfxx zYZ+~jugl@SkbZ}w1i0zlrQzsP;zuQPEH09J9%({K5b1WH7;y z4awLT(U;-=?H&dnB%T^c+Ber9^r|TaGmK^3z^CyDeWg3lK~zpX0AYr`E(k>8u?WQc zQSRhY4Z*`v6i8Kwm%=h9G|jj+rGp9wh`vmXne9|jJN*6!kmdWsD#2!VGX?Wob9o5{ z)~z$Poyct&(}K=Qhu;%y;W#(Q!z;0W_xrXZVmT_U(#KLdYWaj*cxL}#a6mcKE_mA& zJ7>i<>h!`m8?4s@T5C3647&gor(f6C|NXrWOjW%Nsv^d5COFYSls~1Pz#!Uum%DE{ zz2@~YTz2#Zlg#@JwH#j%WVJv4B$UNjXpTbT2{PUCjCt` zvG|C$pw($a*KOV10jWK@2|N0eQL;`6(RVDA%@36p9T|9mtxagL9Y+}-kED2dg_m{a zNcxvYxjCy?5}kb%kU2&`M@-h!{^gtwcEi*8B|sz>AW_&msE1{4aDDyN_=bU}WxcH} znsRh0!hr#^2AAKL0N7-LU&+WyU=Z#32S9tnE>^z&Xr+0paPNUoU`SMu#v;h4vljsK z0K_9mgZ3lSbxVwnN(Tcy@28YXp8(pyuuuCLM4-_7HnLTmDvpMri)?XUgcC`r!o)Kb zwF%;&4q2DbXK~|XZMkwV$Hu<=W6@B}&JerfIFoT4l0fhBeIeG+(h-!i&R@mm?GNyire;3sp3NlRUdo8m| z+*I4Pp2Lb*=?6wl$xiQTWT%+54lEtTkVFnks9huO5@<5O8LWT+6n9Zq9O%Z#@hb9R}I<%ucP>}0q#LeCo^XGhL> z7TXueTFRXtq+0_ov%-qr+yPdfB!a{WF>Gw4z%Ot{f?!7DWOS$6rhkBF6v}}&hRTyC z-k=x1iS{B}&J<5<4qbyfClp3f$Cc63n8@z&cO*YU6NtAeXNEjahRn#Wppfs4f4B-y z@yTMBHsAR{12FcovD0b-cdDO+v<`>fzn~5_8*0hB`GjhB` z=h-9YrH|asd?|9CjObQ612Zz`ua8%u%>DlW6n`Dd3$KB#1rf+JkdhG3yv@+F$sPF# z4Y!$VoCtR5_%0W6;6jip+^?UV_LT-@=IIG^oP+Q#Y|w*YM&E4?f4^f_w&^#F3LoBC zFE3_d^(|X%6l1%rdCK0yO>rV@w;tSrY+ND@8cG|*060}b0(LvY5sL^yV(l02Y^g!> z7x^+%)vVKYB(^_o+V*Ift_$5Z`Pz%XV`%TA9l zUB&QbTL!T$%ldE2SB)fl!wMRF8s&e%5QBw2hc7FA1~>IA0L$sd9W8mKz>V&65Yomn!FvH*kh8?WJ zRv#R4GgA;Qro6MD#(R!zuvdEwzM+_eYq@X#ZB)@RIw6zen&)t(qpB9O6Juo%jVk>I zz*`tZ`3De=P1HhXkYF|64|`y_dM|v1>TTI%8<7*>i$RC&5zWZ|JC?^YVV(vf7+*%8X`D=-97xT zJj&uK%0bu?qmn^tVNI*me=4IkUQX)W0~lTW&(Bz{1Oy=GNwcEY4O#^T1aBu;ZD-k> zYhFZy>H*u0N1pXfm?Tq!@cJ~rX4N~EE(pd{s$aA*YPw+6iYgDt!mK|fJ;b7kTb3$D zi<$m0!tm+!$JDFSN)Aki!cE_r4$G1{bQ&V5m)K01R zU$^r_JGV*J7Z3SXuAzN>{d=%T%kvI1yf5GSG9JG7im@#q|C@pBr#|Tk5w~<-hUx)|7;~!^N7kR<8#!MKsY_TEj>wlb(^q2JRs)Fn zkzVbzOr#bf#UiHXuParDPe&msiO8cVP`r3z^*3;Q4cyR4V-WwxS6AwXf%o`0EXz3&My zw^%*;0l9CG`G_xcm)2R;_A;u;3NJQ;G%i>y)~VwA%zqn7^EI>LW&Tx<`6!@z#n+$sJ; zUcY+8rKSz-|M9ohPVXnQlxh&`<~!@B(Qhg2{sXxl+0y~0W^vs_{`Z0g)_v7aFAK*th?34B}6SiA}nZ<6zlppi! zUxqX8AM^WP#$oq&#Ef5`#9$|xPq3d8Wc)h(U!gh7i2axu6tuql577QH3^P*gyuzRW z|7#)WF~1!4X#dV@{ZZihjhOv^uO9yI+UY1T<3`NyG4V90^T~KdP%J3(DQLzUb_lzB zwLT5vf!P)^VK-n8n!fhyKEuv9{=X)k)@tf6f_U!wAwzE&H)m>Z?Kjv<{{U{c|Le{b zlYOZ1+MD$ytbbye&-wp*^#0~W`1{-X%^TKz@3~+8-D`l~kN?R)Y`B*xfBQCEENG3g z|LqvI^5Q{Z1hW?|_2aO1vXSCDoZ}B;F>`QNj#Lb~Uit?i+zLJsA8^G97tEByAd!wr zIfa%KQBAz)+Tsy2HD6)kvjx!G9#0#=Kxx`bl$R-QOFAY?YzOzmoJd$&)H7}-!bZh= z7rJ}^TP*yqiSqC}mP6-HnxYieuRrJTQ?nit@V!XBF~Y5ed}4Jl_y_38omxlENc?>G zet9D_ROMdkwFs~>$aYv?28mPfv3`|S(hBQx*tMXTFZa^W+&>Ch5r3b)u|6V=Kq_5g z0)rD2St^Ljz=j$)N6e-?BT+6D8tRSm3CQ|Y?3A|12k`tvMYqLt)GBsHL-#7Z0U_+8 zlrzn_|5XX=2xh0=X2r%*h&)tTDej6n|G&=hjMJt1Kz%3`X$wG7aAV7F->@1@lAg~O zJde8)VOE9!ShHsSyT-=i>AY�m{$vJ|XrtOQPv=(gED`)Ts~ocPU%~dc}vUJ@II( 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 TY1|s7Ie&@#Ncum{zlZ= 11.0.10.1" - }, - "multi_instance": true, - "services": [ - "nginx", - "php8.0-fpm" - ], - "arguments": { - "install" : [ - { - "name": "domain", - "type": "domain" - }, - { - "name": "path", - "type": "path", - "example": "/example", - "default": "/digiscreen" - }, - { - "name": "pixabay", - "type": "string", - "example": "123456abc", - "optional": true, - "ask": { - "en": "Your Pixabay API key:", - "fr": "Votre clé d’API Pixabay :" - }, - "help": { - "en": "Optional: a Pixabay API key will let you chose a background by entering keywords.", - "fr": "Optionnel : une clé d’API Pixabay vous permettra de choisir un fond d’écran en entrant un mot clé." - } - }, - { - "name": "googleYoutube", - "type": "string", - "example": "123456abc", - "optional": true, - "ask": { - "en": "Your Google API key:", - "fr": "Votre clé d’API Google :" - }, - "help": { - "en": "Optional: a Google API key will let you insert videos from Youtube on your Digiscreen", - "fr": "Optionnel : une clé d’API Google vous permettra d’afficher des vidéos de Youtube sur votre Digiscreen." - } - }, - { - "name": "is_public", - "type": "boolean", - "help": { - "en": "If public, any visitor can use this app and thus will benefit from your API keys for Pixabay and Youtube.", - "fr": "Si l’application est publique, n’importe quel visiteur pourra utiliser cette application et bénéficiera donc de vos clés d’API pour Pixabay et Youtube." - }, - "default": true - } - ] - } -} diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000..58243fa --- /dev/null +++ b/manifest.toml @@ -0,0 +1,89 @@ +#:schema https://raw.githubusercontent.com/YunoHost/apps/master/schemas/manifest.v2.schema.json + +packaging_format = 2 + +id = "digiscreen" +name = "Digiscreen" +description.en = "An interactive wallpaper for the classroom, face-to-face or distant" +description.fr = "Un fond d'écran interactif pour la salle de classe en présence ou à distance." + +version = "0.6.4~ynh1" + +maintainers = ["Pierre-Amiel Giraud"] + +[upstream] +license = "GPL-3.0-only" +website = "https://ladigitale.dev/" +demo = "https://ladigitale.dev/digiscreen/" +admindoc = "https://codeberg.org/ladigitale/digiscreen/src/branch/main/README.md" +userdoc = "https://ladigitale.dev/blog/digiscreen-un-fond-d-ecran-interactif-pour-la-classe" +code = "https://codeberg.org/ladigitale/digiscreen" +fund = "https://opencollective.com/ladigitale" + +[integration] +yunohost = ">= 11.0.10" +architectures = "all" +multi_instance = true +ldap = "not_relevant" +sso = "not_relevant" +disk = "50M" +ram.build = "50M" +ram.runtime = "50M" + +[install] + [install.domain] + type = "domain" + + [install.path] + type = "path" + default = "/digiscreen" + + [install.pixabay] + ask.en = "Your Pixabay API key" + ask.fr = "Votre clé d’API Pixabay" + help.en = "Optional: a Pixabay API key will let you chose a background by entering keywords." + help.fr = "Optionnel : une clé d’API Pixabay vous permettra de choisir un fond d’écran en entrant un mot clé." + type = "string" + example = "123456abc" + optional = true + + [install.googleYoutube] + ask.en = "Your Google API key" + ask.fr = "Votre clé d’API Google" + help.en = "Optional: a Google API key will let you insert videos from Youtube on your Digiscreen" + help.fr = "Optionnel : une clé d’API Google vous permettra d’afficher des vidéos de Youtube sur votre Digiscreen." + type = "string" + example = "123456abc" + optional = true + + [install.init_main_permission] + help.en = "If public, any visitor can use this app and thus will benefit from your API keys for Pixabay and Youtube." + help.fr = "Si l’application est publique, n’importe quel visiteur pourra utiliser cette application et bénéficiera donc de vos clés d’API pour Pixabay et Youtube." + type = "group" + default = "visitors" + +[resources] + [resources.sources.main] + url = "https://github.com/YunoHost-Apps/digiscreen_ynh/releases/download/0.6.4/digiscreen-0.6.4.zip" + sha256 = "92273e360e06639283ee9db746d1d53006af7ea405f1ecbe85a262b39eae6756" + + [resources.system_user] + + [resources.install_dir] + + [resources.data_dir] + + [resources.permissions] + main.url = "/" + + [resources.ports] + + [resources.apt] + packages = [ + "mariadb-server", + "php8.2", + "php8.2-fpm", + ] + + [resources.database] + type = "mysql" diff --git a/scripts/_common.sh b/scripts/_common.sh index e8accab..5584c64 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,18 +4,27 @@ # COMMON VARIABLES #================================================= -# dependencies used by the app -pkg_dependencies="" nodejs_version="14.19.3" #================================================= # PERSONAL HELPERS #================================================= +_digiscreen_build() { + ( + cd "$install_dir/sources" + echo "VUE_APP_PIXABAY_API_KEY=$pixabay" >> .env + echo "VUE_APP_GOOGLE_API_KEY=$googleYoutube" >> .env + + ynh_npm install + ynh_npm run build + ) +} + #================================================= # EXPERIMENTAL HELPERS #================================================= #================================================= # FUTURE OFFICIAL HELPERS -#================================================= +#================================================= diff --git a/scripts/backup b/scripts/backup index 1c7b676..18f83fe 100644 --- a/scripts/backup +++ b/scripts/backup @@ -10,45 +10,16 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - ### Remove this function if there's nothing to clean before calling the remove script. - true -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_print_info --message="Loading installation settings..." - -app=$YNH_APP_INSTANCE_NAME - -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -domain=$(ynh_app_setting_get --app=$app --key=domain) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -datadir=$(ynh_app_setting_get --app=$app --key=datadir) - #================================================= # DECLARE DATA AND CONF FILES TO BACKUP #================================================= ynh_print_info --message="Declaring files to be backed up..." -### N.B. : the following 'ynh_backup' calls are only a *declaration* of what needs -### to be backuped and not an actual copy of any file. The actual backup that -### creates and fill the archive with the files happens in the core after this -### script is called. Hence ynh_backups calls takes basically 0 seconds to run. - #================================================= # BACKUP THE APP MAIN DIR #================================================= -ynh_backup --src_path="$final_path" +ynh_backup --src_path="$install_dir" #================================================= # BACKUP THE NGINX CONFIGURATION @@ -62,26 +33,8 @@ ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -#================================================= -# BACKUP FAIL2BAN CONFIGURATION -#================================================= - -#ynh_backup --src_path="/etc/fail2ban/jail.d/$app.conf" -#ynh_backup --src_path="/etc/fail2ban/filter.d/$app.conf" - -#================================================= -# SPECIFIC BACKUP -#================================================= -# BACKUP VARIOUS FILES -#================================================= - -#ynh_backup --src_path="/etc/cron.d/$app" - -#ynh_backup --src_path="/etc/$app/" - #================================================= # END OF SCRIPT #================================================= ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." - diff --git a/scripts/change_url b/scripts/change_url index 5c958cc..f42dbab 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -13,58 +13,58 @@ source /usr/share/yunohost/helpers # RETRIEVE ARGUMENTS #================================================= -old_domain=$YNH_APP_OLD_DOMAIN -old_path=$YNH_APP_OLD_PATH +#REMOVEME? old_domain=$YNH_APP_OLD_DOMAIN +#REMOVEME? old_path=$YNH_APP_OLD_PATH -new_domain=$YNH_APP_NEW_DOMAIN -new_path=$YNH_APP_NEW_PATH +#REMOVEME? new_domain=$YNH_APP_NEW_DOMAIN +#REMOVEME? new_path=$YNH_APP_NEW_PATH -app=$YNH_APP_INSTANCE_NAME +#REMOVEME? app=$YNH_APP_INSTANCE_NAME #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --time --weight=1 +#REMOVEME? ynh_script_progression --message="Loading installation settings..." --time --weight=1 -# Needed for helper "ynh_add_nginx_config" -final_path=$(ynh_app_setting_get --app=$app --key=final_path) +#REMOVEME? # Needed for helper "ynh_add_nginx_config" +#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) # Add settings here as needed by your application -#db_name=$(ynh_app_setting_get --app=$app --key=db_name) +#REMOVEME? #db_name=$(ynh_app_setting_get --app=$app --key=db_name) #db_user=$db_name -#db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) +#REMOVEME? #db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) #================================================= # BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 +#REMOVEME? ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 # Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { +#REMOVEME? ynh_backup_before_upgrade +#REMOVEME? ynh_clean_setup () { # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. - ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +#REMOVEME? ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" # Restore it if the upgrade fails - ynh_restore_upgradebackup +#REMOVEME? ynh_restore_upgradebackup } # Exit if an error occurs during the execution of the script -ynh_abort_if_errors +#REMOVEME? ynh_abort_if_errors #================================================= # CHECK WHICH PARTS SHOULD BE CHANGED #================================================= -change_domain=0 -if [ "$old_domain" != "$new_domain" ] +#REMOVEME? change_domain=0 +#REMOVEME? if [ "$old_domain" != "$new_domain" ] then - change_domain=1 + #REMOVEME? change_domain=1 fi -change_path=0 -if [ "$old_path" != "$new_path" ] +#REMOVEME? change_path=0 +#REMOVEME? if [ "$old_path" != "$new_path" ] then - change_path=1 + #REMOVEME? change_path=1 fi #================================================= @@ -74,28 +74,30 @@ fi #================================================= ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 -nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf +ynh_change_url_nginx_config + +#REMOVEME? nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf # Change the path in the NGINX config file if [ $change_path -eq 1 ] then # Make a backup of the original NGINX config file if modified - ynh_backup_if_checksum_is_different --file="$nginx_conf_path" +#REMOVEME? ynh_backup_if_checksum_is_different --file="$nginx_conf_path" # Set global variables for NGINX helper - domain="$old_domain" - path_url="$new_path" +#REMOVEME? domain="$old_domain" +#REMOVEME? path="$new_path" # Create a dedicated NGINX config - ynh_add_nginx_config +#REMOVEME? ynh_add_nginx_config fi # Change the domain for NGINX if [ $change_domain -eq 1 ] then # Delete file checksum for the old conf file location - ynh_delete_file_checksum --file="$nginx_conf_path" - mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf +#REMOVEME? ynh_delete_file_checksum --file="$nginx_conf_path" +#REMOVEME? mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf # Store file checksum for the new config file location - ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +#REMOVEME? ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" fi #================================================= @@ -109,9 +111,9 @@ fi #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 +#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 -ynh_systemd_action --service_name=nginx --action=reload +#REMOVEME? #REMOVEME? ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT diff --git a/scripts/install b/scripts/install index 72fcd55..ada532e 100644 --- a/scripts/install +++ b/scripts/install @@ -10,183 +10,35 @@ source _common.sh source /usr/share/yunohost/helpers #================================================= -# MANAGE SCRIPT FAILURE +# INSTALL NODEJS #================================================= +ynh_script_progression --message="Installing NodeJS..." --weight 3 -ynh_clean_setup () { - ### Remove this function if there's nothing to clean before calling the remove script. - true -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# RETRIEVE ARGUMENTS FROM THE MANIFEST -#================================================= - -domain=$YNH_APP_ARG_DOMAIN -path_url=$YNH_APP_ARG_PATH -#admin=$YNH_APP_ARG_ADMIN -is_public=$YNH_APP_ARG_IS_PUBLIC -#language=$YNH_APP_ARG_LANGUAGE -#password=$YNH_APP_ARG_PASSWORD -pixabay=$YNH_APP_ARG_PIXABAY -googleYoutube=$YNH_APP_ARG_GOOGLEYOUTUBE - -### If it's a multi-instance app, meaning it can be installed several times independently -### The id of the app as stated in the manifest is available as $YNH_APP_ID -### The instance number is available as $YNH_APP_INSTANCE_NUMBER (equals "1", "2"...) -### The app instance name is available as $YNH_APP_INSTANCE_NAME -### - the first time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample -### - the second time the app is installed, YNH_APP_INSTANCE_NAME = ynhexample__2 -### - ynhexample__{N} for the subsequent installations, with N=3,4... -### The app instance name is probably what interests you most, since this is -### guaranteed to be unique. This is a good unique identifier to define installation path, -### db names... -app=$YNH_APP_INSTANCE_NAME - -#================================================= -# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS -#================================================= -### About --weight and --time -### ynh_script_progression will show to your final users the progression of each scripts. -### In order to do that, --weight will represent the relative time of execution compared to the other steps in the script. -### --time is a packager option, it will show you the execution time since the previous call. -### This option should be removed before releasing your app. -### Use the execution time, given by --time, to estimate the weight of a step. -### A common way to do it is to set a weight equal to the execution time in second +1. -### The execution time is given for the duration since the previous call. So the weight should be applied to this previous call. -ynh_script_progression --message="Validating installation parameters..." --weight=1 - -### If the app uses NGINX as web server (written in HTML/PHP in most cases), the final path should be "/var/www/$app". -### If the app provides an internal web server (or uses another application server such as uWSGI), the final path should be "/opt/yunohost/$app" -final_path=/var/www/$app -test ! -e "$final_path" || ynh_die --message="This path already contains a folder" - -# Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url - -#================================================= -# STORE SETTINGS FROM MANIFEST -#================================================= -ynh_script_progression --message="Storing installation settings..." --weight=1 - -ynh_app_setting_set --app=$app --key=domain --value=$domain -ynh_app_setting_set --app=$app --key=path --value=$path_url -#ynh_app_setting_set --app=$app --key=admin --value=$admin -#ynh_app_setting_set --app=$app --key=language --value=$language - -#================================================= -# STANDARD MODIFICATIONS -#================================================= -# FIND AND OPEN A PORT -#================================================= -#ynh_script_progression --message="Finding an available port..." --time --weight=1 - -### Use these lines if you have to open a port for the application -### `ynh_find_port` will find the first available port starting from the given port. -### If you're not using these lines: -### - Remove the section "CLOSE A PORT" in the remove script - -# Find an available port -#port=$(ynh_find_port --port=8095) -#ynh_app_setting_set --app=$app --key=port --value=$port - -# Optional: Expose this port publicly -# (N.B.: you only need to do this if the app actually needs to expose the port publicly. -# If you do this and the app doesn't actually need you are CREATING SECURITY HOLES IN THE SERVER !) - -# Open the port -# ynh_script_progression --message="Configuring firewall..." --time --weight=1 -# ynh_exec_warn_less yunohost firewall allow --no-upnp TCP $port - -#================================================= -# INSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Installing dependencies..." --weight=1 - -### `ynh_install_app_dependencies` allows you to add any "apt" dependencies to the package. -### Those deb packages will be installed as dependencies of this package. -### If you're not using this helper: -### - Remove the section "REMOVE DEPENDENCIES" in the remove script -### - Remove the variable "pkg_dependencies" in _common.sh -### - As well as the section "REINSTALL DEPENDENCIES" in the restore script -### - And the section "UPGRADE DEPENDENCIES" in the upgrade script - -#ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# CREATE DEDICATED USER -#================================================= -ynh_script_progression --message="Configuring system user..." --weight=1 - -# Create a system user -ynh_system_user_create --username=$app --home_dir="$final_path" - -#================================================= -# CREATE A MYSQL DATABASE -#================================================= -#ynh_script_progression --message="Creating a MySQL database..." --time --weight=1 - -### Use these lines if you need a database for the application. -### `ynh_mysql_setup_db` will create a database, an associated user and a ramdom password. -### The password will be stored as 'mysqlpwd' into the app settings, -### and will be available as $db_pwd -### If you're not using these lines: -### - Remove the section "BACKUP THE MYSQL DATABASE" in the backup script -### - Remove also the section "REMOVE THE MYSQL DATABASE" in the remove script -### - As well as the section "RESTORE THE MYSQL DATABASE" in the restore script - -#db_name=$(ynh_sanitize_dbid --db_name=$app) -#db_user=$db_name -#ynh_app_setting_set --app=$app --key=db_name --value=$db_name -#ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name +ynh_install_nodejs --nodejs_version="$nodejs_version" +ynh_use_nodejs #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." --weight=1 -### `ynh_setup_source` is used to install an app from a zip or tar.gz file, -### downloaded from an upstream source, like a git repository. -### `ynh_setup_source` use the file conf/app.src - -ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src -working_path=/tmp/$app -ynh_setup_source --dest_dir="$working_path" +ynh_setup_source --dest_dir="$install_dir/sources" -cd $working_path +_digiscreen_build -echo VUE_APP_PIXABAY_API_KEY="$pixabay" >> .env -echo VUE_APP_GOOGLE_API_KEY="$googleYoutube" >> .env +mv "$install_dir/sources/dist" "$install_dir/www" +ynh_secure_remove --file="$install_dir/sources" -ynh_install_nodejs --nodejs_version=$nodejs_version -ynh_use_nodejs -ynh_npm install -ynh_npm run build - -mv $working_path/dist $final_path -ynh_secure_remove --file=$working_path - -# FIXME: this should be managed by the core in the future -# Here, as a packager, you may have to tweak the ownerhsip/permissions -# such that the appropriate users (e.g. maybe www-data) can access -# files in some cases. -# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder - -# this will be treated as a security issue. -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R "$app:www-data" "$install_dir" #================================================= # NGINX CONFIGURATION #================================================= ynh_script_progression --message="Configuring NGINX web server..." --weight=1 -### `ynh_add_nginx_config` will use the file conf/nginx.conf - -# Create a dedicated NGINX config ynh_add_nginx_config #================================================= @@ -194,234 +46,10 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Configuring PHP-FPM..." --weight=1 -### `ynh_add_fpm_config` is used to set up a PHP config. -### You can remove it if your app doesn't use PHP. -### `ynh_add_fpm_config` will use the files conf/php-fpm.conf -### If you're not using these lines: -### - You can remove these files in conf/. -### - Remove the section "BACKUP THE PHP-FPM CONFIGURATION" in the backup script -### - Remove also the section "REMOVE PHP-FPM CONFIGURATION" in the remove script -### - As well as the section "RESTORE THE PHP-FPM CONFIGURATION" in the restore script -### with the reload at the end of the script. -### - And the section "PHP-FPM CONFIGURATION" in the upgrade script - -# Create a dedicated PHP-FPM config ynh_add_fpm_config -#================================================= -# SPECIFIC SETUP -#================================================= -# ... -#================================================= - -#================================================= -# CREATE DATA DIRECTORY -#================================================= -#ynh_script_progression --message="Creating a data directory..." --time --weight=1 - -### Use these lines if you need to create a directory to store "persistent files" for the application. -### Usually this directory is used to store uploaded files or any file that won't be updated during -### an upgrade and that won't be deleted during app removal unless "--purge" option is used. -### If you're not using these lines: -### - Remove the section "BACKUP THE DATA DIR" in the backup script -### - Remove the section "RESTORE THE DATA DIRECTORY" in the restore script -### - As well as the section "REMOVE DATA DIR" in the remove script - -#datadir=/home/yunohost.app/$app -#ynh_app_setting_set --app=$app --key=datadir --value=$datadir - -#mkdir -p $datadir - -# FIXME: this should be managed by the core in the future -# Here, as a packager, you may have to tweak the ownerhsip/permissions -# such that the appropriate users (e.g. maybe www-data) can access -# files in some cases. -# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder - -# this will be treated as a security issue. -#chmod 750 "$datadir" -#chmod -R o-rwx "$datadir" -#chown -R $app:www-data "$datadir" - -#================================================= -# ADD A CONFIGURATION -#================================================= -#ynh_script_progression --message="Adding a configuration file..." --time --weight=1 - -### You can add specific configuration files. -### -### Typically, put your template conf file in ../conf/your_config_file -### The template may contain strings such as __FOO__ or __FOO_BAR__, -### which will automatically be replaced by the values of $foo and $foo_bar -### -### ynh_add_config will also keep track of the config file's checksum, -### which later during upgrade may allow to automatically backup the config file -### if it's found that the file was manually modified -### -### Check the documentation of `ynh_add_config` for more info. - -#ynh_add_config --template="some_config_file" --destination="$final_path/some_config_file" - -# FIXME: this should be handled by the core in the future -# You may need to use chmod 600 instead of 400, -# for example if the app is expected to be able to modify its own config -#chmod 400 "$final_path/some_config_file" -#chown $app:$app "$final_path/some_config_file" - -### For more complex cases where you want to replace stuff using regexes, -### you shoud rely on ynh_replace_string (which is basically a wrapper for sed) -### When doing so, you also need to manually call ynh_store_file_checksum -### -### ynh_replace_string --match_string="match_string" --replace_string="replace_string" --target_file="$final_path/some_config_file" -### ynh_store_file_checksum --file="$final_path/some_config_file" - -#================================================= -# SETUP SYSTEMD -#================================================= -#ynh_script_progression --message="Configuring a systemd service..." --time --weight=1 - -### `ynh_systemd_config` is used to configure a systemd script for an app. -### It can be used for apps that use sysvinit (with adaptation) or systemd. -### Have a look at the app to be sure this app needs a systemd script. -### `ynh_systemd_config` will use the file conf/systemd.service -### If you're not using these lines: -### - You can remove those files in conf/. -### - Remove the section "BACKUP SYSTEMD" in the backup script -### - Remove also the section "STOP AND REMOVE SERVICE" in the remove script -### - As well as the section "RESTORE SYSTEMD" in the restore script -### - And the section "SETUP SYSTEMD" in the upgrade script - -# Create a dedicated systemd config -#ynh_add_systemd_config - -#================================================= -# SETUP APPLICATION WITH CURL -#================================================= - -### Use these lines only if the app installation needs to be finalized through -### web forms. We generally don't want to ask the final user, -### so we're going to use curl to automatically fill the fields and submit the -### forms. - -# Set the app as temporarily public for curl call -#ynh_script_progression --message="Configuring SSOwat..." --time --weight=1 -# Making the app public for curl -#ynh_permission_update --permission="main" --add="visitors" - -# Installation with curl -#ynh_script_progression --message="Finalizing installation..." --time --weight=1 -#ynh_local_curl "/INSTALL_PATH" "key1=value1" "key2=value2" "key3=value3" - -# Remove the public access -#ynh_permission_update --permission="main" --remove="visitors" - -#================================================= -# GENERIC FINALIZATION -#================================================= -# SETUP LOGROTATE -#================================================= -#ynh_script_progression --message="Configuring log rotation..." --time --weight=1 - -### `ynh_use_logrotate` is used to configure a logrotate configuration for the logs of this app. -### Use this helper only if there is effectively a log file for this app. -### If you're not using this helper: -### - Remove the section "BACKUP LOGROTATE" in the backup script -### - Remove also the section "REMOVE LOGROTATE CONFIGURATION" in the remove script -### - As well as the section "RESTORE THE LOGROTATE CONFIGURATION" in the restore script -### - And the section "SETUP LOGROTATE" in the upgrade script - -# Use logrotate to manage application logfile(s) -#ynh_use_logrotate - -#================================================= -# INTEGRATE SERVICE IN YUNOHOST -#================================================= -#ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 - -### `yunohost service add` integrates a service in YunoHost. It then gets -### displayed in the admin interface and through the others `yunohost service` commands. -### (N.B.: this line only makes sense if the app adds a service to the system!) -### If you're not using these lines: -### - You can remove these files in conf/. -### - Remove the section "REMOVE SERVICE INTEGRATION IN YUNOHOST" in the remove script -### - As well as the section "INTEGRATE SERVICE IN YUNOHOST" in the restore script -### - And the section "INTEGRATE SERVICE IN YUNOHOST" in the upgrade script - -#yunohost service add $app --description="A short description of the app" --log="/var/log/$app/$app.log" - -### Additional options starting with 3.8: -### -### --needs_exposed_ports "$port" a list of ports that needs to be publicly exposed -### which will then be checked by YunoHost's diagnosis system -### (N.B. DO NOT USE THIS is the port is only internal!!!) -### -### --test_status "some command" a custom command to check the status of the service -### (only relevant if 'systemctl status' doesn't do a good job) -### -### --test_conf "some command" some command similar to "nginx -t" that validates the conf of the service -### -### Re-calling 'yunohost service add' during the upgrade script is the right way -### to proceed if you later realize that you need to enable some flags that -### weren't enabled on old installs (be careful it'll override the existing -### service though so you should re-provide all relevant flags when doing so) - -#================================================= -# START SYSTEMD SERVICE -#================================================= -#ynh_script_progression --message="Starting a systemd service..." --time --weight=1 - -### `ynh_systemd_action` is used to start a systemd service for an app. -### Only needed if you have configure a systemd service -### If you're not using these lines: -### - Remove the section "STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the backup script -### - As well as the section "START SYSTEMD SERVICE" in the restore script -### - As well as the section"STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the upgrade script -### - And the section "STOP SYSTEMD SERVICE" and "START SYSTEMD SERVICE" in the change_url script - -# Start a systemd service -#ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/$app.log" - -#================================================= -# SETUP FAIL2BAN -#================================================= -#ynh_script_progression --message="Configuring Fail2Ban..." --time --weight=1 - -# Create a dedicated Fail2Ban config -#ynh_add_fail2ban_config --logpath="/var/log/nginx/${domain}-error.log" --failregex="Regex to match into the log for a failed login" - -#================================================= -# SETUP SSOWAT -#================================================= -ynh_script_progression --message="Configuring permissions..." --weight=1 - -# Make app public if necessary -if [ $is_public -eq 1 ] -then - # Everyone can access the app. - # The "main" permission is automatically created before the install script. - ynh_permission_update --permission="main" --add="visitors" -fi - -### N.B. : the following extra permissions only make sense if your app -### does have for example an admin interface or an API. - -# Only the admin can access the admin panel of the app (if the app has an admin panel) -#ynh_permission_create --permission="admin" --url="/admin" --allowed=$admin - -# Everyone can access the API part -# We don't want to display the tile in the SSO so we put --show_tile="false" -# And we don't want the YunoHost admin to be able to remove visitors group to this permission, so we put --protected="true" -#ynh_permission_create --permission="api" --url="/api" --allowed="visitors" --show_tile="false" --protected="true" - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= ynh_script_progression --message="Installation of $app completed" --last - diff --git a/scripts/remove b/scripts/remove index 2019d36..e8daf85 100644 --- a/scripts/remove +++ b/scripts/remove @@ -9,30 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -port=$(ynh_app_setting_get --app=$app --key=port) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -datadir=$(ynh_app_setting_get --app=$app --key=datadir) - -#================================================= -# STANDARD REMOVE -#================================================= -# REMOVE APP MAIN DIR -#================================================= -ynh_script_progression --message="Removing app main directory..." --weight=1 - -# Remove the app directory securely -ynh_secure_remove --file="$final_path" - #================================================= # REMOVE NGINX CONFIGURATION #================================================= @@ -49,22 +25,6 @@ ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=1 # Remove the dedicated PHP-FPM config ynh_remove_fpm_config -#================================================= -# REMOVE DEPENDENCIES -#================================================= -ynh_script_progression --message="Removing dependencies..." --weight=1 - -# Remove metapackage and its dependencies -ynh_remove_app_dependencies - -#================================================= -# REMOVE FAIL2BAN CONFIGURATION -#================================================= -#ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=1 - -# Remove the dedicated Fail2Ban config -#ynh_remove_fail2ban_config - #================================================= # SPECIFIC REMOVE #================================================= @@ -72,25 +32,9 @@ ynh_remove_app_dependencies #================================================= ynh_script_progression --message="Removing various files..." --weight=1 -# Remove a cron file -#ynh_secure_remove --file="/etc/cron.d/$app" - -# Remove a directory securely -#ynh_secure_remove --file="/etc/$app" - # Remove the log files ynh_secure_remove --file="/var/log/$app" -#================================================= -# GENERIC FINALIZATION -#================================================= -# REMOVE DEDICATED USER -#================================================= -ynh_script_progression --message="Removing the dedicated system user..." --weight=1 - -# Delete a system user -ynh_system_user_delete --username=$app - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/restore b/scripts/restore index 2c60b67..c5cc706 100644 --- a/scripts/restore +++ b/scripts/restore @@ -10,40 +10,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# MANAGE SCRIPT FAILURE -#================================================= - -ynh_clean_setup () { - #### Remove this function if there's nothing to clean before calling the remove script. - true -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -path_url=$(ynh_app_setting_get --app=$app --key=path) -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) -db_user=$db_name -phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) -datadir=$(ynh_app_setting_get --app=$app --key=datadir) - -#================================================= -# CHECK IF THE APP CAN BE RESTORED -#================================================= -ynh_script_progression --message="Validating restoration parameters..." --weight=1 - -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " - #================================================= # STANDARD RESTORATION STEPS #================================================= @@ -53,30 +19,16 @@ ynh_script_progression --message="Restoring the NGINX web server configuration.. ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" -#================================================= -# RECREATE THE DEDICATED USER -#================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 - -# Create the dedicated user (if not existing) -ynh_system_user_create --username=$app --home_dir="$final_path" - #================================================= # RESTORE THE APP MAIN DIR #================================================= ynh_script_progression --message="Restoring the app main directory..." --weight=1 -ynh_restore_file --origin_path="$final_path" +ynh_restore_file --origin_path="$install_dir" -# FIXME: this should be managed by the core in the future -# Here, as a packager, you may have to tweak the ownerhsip/permissions -# such that the appropriate users (e.g. maybe www-data) can access -# files in some cases. -# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder - -# this will be treated as a security issue. -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R "$app:www-data" "$install_dir" #================================================= # RESTORE THE PHP-FPM CONFIGURATION @@ -85,34 +37,6 @@ ynh_script_progression --message="Restoring the PHP-FPM configuration..." --weig ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" -#================================================= -# RESTORE FAIL2BAN CONFIGURATION -#================================================= -#ynh_script_progression --message="Restoring the Fail2Ban configuration..." --time --weight=1 - -#ynh_restore_file --origin_path="/etc/fail2ban/jail.d/$app.conf" -#ynh_restore_file --origin_path="/etc/fail2ban/filter.d/$app.conf" -#ynh_systemd_action --action=restart --service_name=fail2ban - -#================================================= -# SPECIFIC RESTORATION -#================================================= -# REINSTALL DEPENDENCIES -#================================================= -ynh_script_progression --message="Reinstalling dependencies..." --weight=1 - -# Define and install dependencies -ynh_install_app_dependencies $pkg_dependencies - -#================================================= -# RESTORE VARIOUS FILES -#================================================= -#ynh_script_progression --message="Restoring various files..." --time --weight=1 - -#ynh_restore_file --origin_path="/etc/cron.d/$app" - -#ynh_restore_file --origin_path="/etc/$app/" - #================================================= # GENERIC FINALIZATION #================================================= @@ -120,12 +44,11 @@ ynh_install_app_dependencies $pkg_dependencies #================================================= ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1 -ynh_systemd_action --service_name=php$phpversion-fpm --action=reload -ynh_systemd_action --service_name=nginx --action=reload +ynh_systemd_action --service_name="php$phpversion-fpm" --action=reload +ynh_systemd_action --service_name="nginx" --action=reload #================================================= # END OF SCRIPT #================================================= ynh_script_progression --message="Restoration completed for $app" --last - diff --git a/scripts/upgrade b/scripts/upgrade index 0905b70..f5238fb 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -9,46 +9,12 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# LOAD SETTINGS -#================================================= -ynh_script_progression --message="Loading installation settings..." --weight=1 - -app=$YNH_APP_INSTANCE_NAME - -domain=$(ynh_app_setting_get --app=$app --key=domain) -path_url=$(ynh_app_setting_get --app=$app --key=path) -admin=$(ynh_app_setting_get --app=$app --key=admin) -final_path=$(ynh_app_setting_get --app=$app --key=final_path) -#language=$(ynh_app_setting_get --app=$app --key=language) -db_name=$(ynh_app_setting_get --app=$app --key=db_name) - #================================================= # CHECK VERSION #================================================= -### This helper will compare the version of the currently installed app and the version of the upstream package. -### $upgrade_type can have 2 different values -### - UPGRADE_APP if the upstream app version has changed -### - UPGRADE_PACKAGE if only the YunoHost package has changed -### ynh_check_app_version_changed will stop the upgrade if the app is up to date. -### UPGRADE_APP should be used to upgrade the core app only if there's an upgrade to do. upgrade_type=$(ynh_check_app_version_changed) -#================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP -#================================================= -ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1 - -# Backup the current version of the app -ynh_backup_before_upgrade -ynh_clean_setup () { - # Restore it if the upgrade fails - ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -ynh_abort_if_errors - #================================================= # STANDARD UPGRADE STEPS #================================================= @@ -56,51 +22,13 @@ ynh_abort_if_errors #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 -# -# N.B. : the followings setting migrations snippets are provided as *EXAMPLES* -# of what you may want to do in some cases (e.g. a setting was not defined on -# some legacy installs and you therefore want to initiaze stuff during upgrade) -# - -# If db_name doesn't exist, create it -#if [ -z "$db_name" ]; then -# db_name=$(ynh_sanitize_dbid --db_name=$app) -# ynh_app_setting_set --app=$app --key=db_name --value=$db_name -#fi - -# If final_path doesn't exist, create it -#if [ -z "$final_path" ]; then -# final_path=/var/www/$app -# ynh_app_setting_set --app=$app --key=final_path --value=$final_path -#fi - -### If nobody installed your app before 4.1, -### then you may safely remove these lines - -# Cleaning legacy permissions -if ynh_legacy_permissions_exists; then - ynh_legacy_permissions_delete_all - - ynh_app_setting_delete --app=$app --key=is_public -fi - -if ! ynh_permission_exists --permission="admin"; then - # Create the required permissions - ynh_permission_create --permission="admin" --url="/admin" --allowed=$admin -fi - -# Create a permission if needed -if ! ynh_permission_exists --permission="api"; then - ynh_permission_create --permission="api" --url="/api" --allowed="visitors" --show_tile="false" --protected="true" -fi - #================================================= -# CREATE DEDICATED USER +# INSTALL NODEJS #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 +ynh_script_progression --message="Installing NodeJS..." --weight 3 -# Create a dedicated user (if not existing) -ynh_system_user_create --username=$app --home_dir="$final_path" +ynh_install_nodejs --nodejs_version="$nodejs_version" +ynh_use_nodejs #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE @@ -109,42 +37,30 @@ ynh_system_user_create --username=$app --home_dir="$final_path" if [ "$upgrade_type" == "UPGRADE_APP" ] then ynh_script_progression --message="Upgrading source files..." --weight=1 - - # Test because file doesn’t exist at first install. It is created at first page opening. - if test -f "$final_path/inc/digiwords.db" - then - # Create a temporary directory - tmpdir="$(mktemp -d)" - - # Backup the inc/digiwords.db file to the temp dir - cp -ar "$final_path/inc/digiwords.db" "$tmpdir/digiwords.db" - - # Remove the app directory securely - ynh_secure_remove --file=$final_path - - # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" - - # Copy digiwords.db back to the final_path - cp -ar "$tmpdir/digiwords.db" "$final_path/inc/digiwords.db" - # Remove the tmp directory securely - ynh_secure_remove --file="$tmpdir" - else - # Download, check integrity, uncompress and patch the source from app.src - ynh_setup_source --dest_dir="$final_path" + ynh_setup_source --dest_dir="$install_dir/sources" + + _digiscreen_build + + # backup... + if [ -f "$install_dir/www/inc/digiwords.db" ]; then + mv "$install_dir/www/inc/digiwords.db" "$install_dir" + fi + + # upgrade... + rm -rf "$install_dir/www" + mv "$install_dir/sources/dist" "$install_dir/www" + + if [ -f "$install_dir/digiwords.db" ]; then + # restore + mkdir -p "$install_dir/www/inc" + mv "$install_dir/digiwords.db" "$install_dir/www/inc" fi fi -# FIXME: this should be managed by the core in the future -# Here, as a packager, you may have to tweak the ownerhsip/permissions -# such that the appropriate users (e.g. maybe www-data) can access -# files in some cases. -# But FOR THE LOVE OF GOD, do not allow r/x for "others" on the entire folder - -# this will be treated as a security issue. -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R "$app:www-data" "$install_dir" #================================================= # NGINX CONFIGURATION @@ -154,45 +70,15 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# UPGRADE DEPENDENCIES -#================================================= -ynh_script_progression --message="Upgrading dependencies..." --weight=1 - -ynh_install_app_dependencies $pkg_dependencies - #================================================= # PHP-FPM CONFIGURATION #================================================= ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 -# Create a dedicated PHP-FPM config ynh_add_fpm_config -#================================================= -# SPECIFIC UPGRADE -#================================================= - -#================================================= -# GENERIC FINALIZATION -#================================================= -# UPGRADE FAIL2BAN -#================================================= -#ynh_script_progression --message="Reconfiguring Fail2Ban..." --time --weight=1 - -# Create a dedicated Fail2Ban config -#ynh_add_fail2ban_config --logpath="/var/log/nginx/${domain}-error.log" --failregex="Regex to match into the log for a failed login" - -#================================================= -# RELOAD NGINX -#================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 - -ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= ynh_script_progression --message="Upgrade of $app completed" --last - diff --git a/tests.toml b/tests.toml new file mode 100644 index 0000000..0fb9f1f --- /dev/null +++ b/tests.toml @@ -0,0 +1,7 @@ +#:schema https://raw.githubusercontent.com/YunoHost/apps/master/schemas/tests.v1.schema.json + +test_format = 1.0 + +[default] + + test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.name = "First release" From e4a03e592d5541b40368094d927e80f48559e4ac Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Mon, 2 Oct 2023 21:57:58 +0000 Subject: [PATCH 02/25] Auto-update README --- README.md | 4 ++-- README_fr.md | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 2fa9e38..c14a9b2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ It shall NOT be edited by hand. # Digiscreen for YunoHost -[![Integration level](https://dash.yunohost.org/integration/digiscreen.svg)](https://dash.yunohost.org/appci/app/digiscreen) ![Working status](https://ci-apps.yunohost.org/ci/badges/digiscreen.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/digiscreen.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/digiscreen.svg)](https://dash.yunohost.org/appci/app/digiscreen) ![Working status](https://ci-apps.yunohost.org/ci/badges/digiscreen.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/digiscreen.maintain.svg) + [![Install Digiscreen with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=digiscreen) *[Lire ce readme en français.](./README_fr.md)* @@ -26,7 +27,6 @@ An interactive wallpaper for the classroom, face-to-face or distant * Official user documentation: * Official admin documentation: * Upstream app code repository: -* YunoHost documentation for this app: * Report a bug: ## Developer info diff --git a/README_fr.md b/README_fr.md index d9982e7..6f86c80 100644 --- a/README_fr.md +++ b/README_fr.md @@ -5,15 +5,16 @@ It shall NOT be edited by hand. # Digiscreen pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/digiscreen.svg)](https://dash.yunohost.org/appci/app/digiscreen) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/digiscreen.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/digiscreen.maintain.svg) +[![Niveau d’intégration](https://dash.yunohost.org/integration/digiscreen.svg)](https://dash.yunohost.org/appci/app/digiscreen) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/digiscreen.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/digiscreen.maintain.svg) + [![Installer Digiscreen avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=digiscreen) *[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer Digiscreen rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* +> *Ce package vous permet d’installer Digiscreen rapidement et simplement sur un serveur YunoHost. +Si vous n’avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l’installer et en profiter.* -## Vue d'ensemble +## Vue d’ensemble Un fond d'écran interactif pour la salle de classe en présence ou à distance. @@ -22,11 +23,10 @@ Un fond d'écran interactif pour la salle de classe en présence ou à distance. **Démo :** https://ladigitale.dev/digiscreen/ ## Documentations et ressources -* Site officiel de l'app : +* Site officiel de l’app : * Documentation officielle utilisateur : -* Documentation officielle de l'admin : -* Dépôt de code officiel de l'app : -* Documentation YunoHost pour cette app : +* Documentation officielle de l’admin : +* Dépôt de code officiel de l’app : * Signaler un bug : ## Informations pour les développeurs @@ -41,4 +41,4 @@ ou sudo yunohost app upgrade digiscreen -u https://github.com/YunoHost-Apps/digiscreen_ynh/tree/testing --debug ``` -**Plus d'infos sur le packaging d'applications :** +**Plus d’infos sur le packaging d’applications :** \ No newline at end of file From ce742a5a0547d00459d9fed861854176cc1de163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 14:03:10 +0200 Subject: [PATCH 03/25] Fix nodejs --- scripts/_common.sh | 1 + scripts/install | 1 - scripts/upgrade | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 5584c64..1f2e3b5 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -16,6 +16,7 @@ _digiscreen_build() { echo "VUE_APP_PIXABAY_API_KEY=$pixabay" >> .env echo "VUE_APP_GOOGLE_API_KEY=$googleYoutube" >> .env + ynh_use_nodejs ynh_npm install ynh_npm run build ) diff --git a/scripts/install b/scripts/install index ada532e..042bf33 100644 --- a/scripts/install +++ b/scripts/install @@ -15,7 +15,6 @@ source /usr/share/yunohost/helpers ynh_script_progression --message="Installing NodeJS..." --weight 3 ynh_install_nodejs --nodejs_version="$nodejs_version" -ynh_use_nodejs #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE diff --git a/scripts/upgrade b/scripts/upgrade index f5238fb..cc13822 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -28,7 +28,6 @@ ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 ynh_script_progression --message="Installing NodeJS..." --weight 3 ynh_install_nodejs --nodejs_version="$nodejs_version" -ynh_use_nodejs #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE From e636156433f7f14ab8f48d1a1a33541214c3f38d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 14:06:07 +0200 Subject: [PATCH 04/25] Fix doc directory --- doc/DESCRIPTION.md | 1 + {docs/screenshots => doc}/DESCRIPTION_fr.md | 0 {docs => doc}/screenshots/digiscreen.jpg | Bin scripts/upgrade | 2 +- 4 files changed, 2 insertions(+), 1 deletion(-) create mode 120000 doc/DESCRIPTION.md rename {docs/screenshots => doc}/DESCRIPTION_fr.md (100%) rename {docs => doc}/screenshots/digiscreen.jpg (100%) diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 120000 index 0000000..c74e6f3 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +DESCRIPTION_fr.md \ No newline at end of file diff --git a/docs/screenshots/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md similarity index 100% rename from docs/screenshots/DESCRIPTION_fr.md rename to doc/DESCRIPTION_fr.md diff --git a/docs/screenshots/digiscreen.jpg b/doc/screenshots/digiscreen.jpg similarity index 100% rename from docs/screenshots/digiscreen.jpg rename to doc/screenshots/digiscreen.jpg diff --git a/scripts/upgrade b/scripts/upgrade index cc13822..42b524a 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -47,7 +47,7 @@ then fi # upgrade... - rm -rf "$install_dir/www" + ynh_secure_remove --file="$install_dir/www" mv "$install_dir/sources/dist" "$install_dir/www" if [ -f "$install_dir/digiwords.db" ]; then From 67e2debc5abd3af9346be69b57e6b7cc4239faca Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Tue, 3 Oct 2023 12:06:27 +0000 Subject: [PATCH 05/25] Auto-update README --- README.md | 23 ++++++++++++++++++++++- README_fr.md | 23 ++++++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c14a9b2..27fd75e 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,32 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in ## Overview -An interactive wallpaper for the classroom, face-to-face or distant +Digiscreen est un fond d'écran interactif pour la salle de classe en présence ou à distance. + +Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation de leurs cours, Digiscreen propose un ensemble d'outils pratiques sous forme de modules : + +* générateur de codes QR ; +* affichage de textes, d'images et de fichiers audio en ligne ; +* dessin ; +* diffusion et découpage de vidéos YouTube ; +* chronomètre et compte à rebours ; +* générateur de nuages de mots ; +* synthèse vocale ; +* exercices interactifs : remise en ordre et texte à trous ; +* contenus intégrés : sites Web, documents en ligne et contenus interactifs (LearningApps par exemple) ; +* capture d'écran ; +* annotation ; +* et d'autres à venir 🙂. + **Shipped version:** 0.6.4~ynh1 **Demo:** https://ladigitale.dev/digiscreen/ + +## Screenshots + +![Screenshot of Digiscreen](./doc/screenshots/digiscreen.jpg) + ## Documentation and resources * Official app website: diff --git a/README_fr.md b/README_fr.md index 6f86c80..260fa71 100644 --- a/README_fr.md +++ b/README_fr.md @@ -16,11 +16,32 @@ Si vous n’avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) po ## Vue d’ensemble -Un fond d'écran interactif pour la salle de classe en présence ou à distance. +Digiscreen est un fond d'écran interactif pour la salle de classe en présence ou à distance. + +Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation de leurs cours, Digiscreen propose un ensemble d'outils pratiques sous forme de modules : + +* générateur de codes QR ; +* affichage de textes, d'images et de fichiers audio en ligne ; +* dessin ; +* diffusion et découpage de vidéos YouTube ; +* chronomètre et compte à rebours ; +* générateur de nuages de mots ; +* synthèse vocale ; +* exercices interactifs : remise en ordre et texte à trous ; +* contenus intégrés : sites Web, documents en ligne et contenus interactifs (LearningApps par exemple) ; +* capture d'écran ; +* annotation ; +* et d'autres à venir 🙂. + **Version incluse :** 0.6.4~ynh1 **Démo :** https://ladigitale.dev/digiscreen/ + +## Captures d’écran + +![Capture d’écran de Digiscreen](./doc/screenshots/digiscreen.jpg) + ## Documentations et ressources * Site officiel de l’app : From 00038ad55cddd79127f20beef969609a8bc5ea23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 14:20:12 +0200 Subject: [PATCH 06/25] Use major nodejs version , use pushd/popd instead of subshell --- scripts/_common.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 1f2e3b5..8511675 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,22 +4,21 @@ # COMMON VARIABLES #================================================= -nodejs_version="14.19.3" +nodejs_version="14" #================================================= # PERSONAL HELPERS #================================================= _digiscreen_build() { - ( - cd "$install_dir/sources" + pushd "$install_dir/sources" echo "VUE_APP_PIXABAY_API_KEY=$pixabay" >> .env echo "VUE_APP_GOOGLE_API_KEY=$googleYoutube" >> .env ynh_use_nodejs ynh_npm install ynh_npm run build - ) + popd } #================================================= From 4d1fb146fe5bffe8e7f79905f88df533868d6fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 14:26:46 +0200 Subject: [PATCH 07/25] debug --- scripts/install | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/install b/scripts/install index 042bf33..eeea10a 100644 --- a/scripts/install +++ b/scripts/install @@ -15,6 +15,13 @@ source /usr/share/yunohost/helpers ynh_script_progression --message="Installing NodeJS..." --weight 3 ynh_install_nodejs --nodejs_version="$nodejs_version" +ynh_use_nodejs +ynh_print_info "ynh_npm alias=$(which ynh_npm || true)" +ynh_print_info "ynh_npm var=$ynh_npm" +ynh_print_info "content of nodejs bin dir : $(ls -lah /opt/node_n/n/versions/node/$nodejs_version/bin || true)" +ynh_exec_warn node --version || true +ynh_exec_warn npm --version || true + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE From 4c1731791dc3e8c97f0012a1976443f7445a907d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 14:42:26 +0200 Subject: [PATCH 08/25] use variable for nodejs --- scripts/_common.sh | 4 ++-- scripts/install | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 8511675..200b4ff 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -16,8 +16,8 @@ _digiscreen_build() { echo "VUE_APP_GOOGLE_API_KEY=$googleYoutube" >> .env ynh_use_nodejs - ynh_npm install - ynh_npm run build + "$ynh_npm" install + "$ynh_npm" run build popd } diff --git a/scripts/install b/scripts/install index eeea10a..042bf33 100644 --- a/scripts/install +++ b/scripts/install @@ -15,13 +15,6 @@ source /usr/share/yunohost/helpers ynh_script_progression --message="Installing NodeJS..." --weight 3 ynh_install_nodejs --nodejs_version="$nodejs_version" -ynh_use_nodejs -ynh_print_info "ynh_npm alias=$(which ynh_npm || true)" -ynh_print_info "ynh_npm var=$ynh_npm" -ynh_print_info "content of nodejs bin dir : $(ls -lah /opt/node_n/n/versions/node/$nodejs_version/bin || true)" -ynh_exec_warn node --version || true -ynh_exec_warn npm --version || true - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE From 96a900aa3ba37fb9cb5551212959bc7db46d039a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 15:31:04 +0200 Subject: [PATCH 09/25] Implement manifestv2 for change_url --- scripts/change_url | 98 ---------------------------------------------- 1 file changed, 98 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index f42dbab..89c1a4c 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -9,64 +9,6 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# RETRIEVE ARGUMENTS -#================================================= - -#REMOVEME? old_domain=$YNH_APP_OLD_DOMAIN -#REMOVEME? old_path=$YNH_APP_OLD_PATH - -#REMOVEME? new_domain=$YNH_APP_NEW_DOMAIN -#REMOVEME? new_path=$YNH_APP_NEW_PATH - -#REMOVEME? app=$YNH_APP_INSTANCE_NAME - -#================================================= -# LOAD SETTINGS -#================================================= -#REMOVEME? ynh_script_progression --message="Loading installation settings..." --time --weight=1 - -#REMOVEME? # Needed for helper "ynh_add_nginx_config" -#REMOVEME? #REMOVEME? install_dir=$(ynh_app_setting_get --app=$app --key=install_dir) - -# Add settings here as needed by your application -#REMOVEME? #db_name=$(ynh_app_setting_get --app=$app --key=db_name) -#db_user=$db_name -#REMOVEME? #db_pwd=$(ynh_app_setting_get --app=$app --key=db_pwd) - -#================================================= -# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP -#================================================= -#REMOVEME? ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 - -# Backup the current version of the app -#REMOVEME? ynh_backup_before_upgrade -#REMOVEME? ynh_clean_setup () { - # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. -#REMOVEME? ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" - - # Restore it if the upgrade fails -#REMOVEME? ynh_restore_upgradebackup -} -# Exit if an error occurs during the execution of the script -#REMOVEME? ynh_abort_if_errors - -#================================================= -# CHECK WHICH PARTS SHOULD BE CHANGED -#================================================= - -#REMOVEME? change_domain=0 -#REMOVEME? if [ "$old_domain" != "$new_domain" ] -then - #REMOVEME? change_domain=1 -fi - -#REMOVEME? change_path=0 -#REMOVEME? if [ "$old_path" != "$new_path" ] -then - #REMOVEME? change_path=1 -fi - #================================================= # STANDARD MODIFICATIONS #================================================= @@ -76,48 +18,8 @@ ynh_script_progression --message="Updating NGINX web server configuration..." -- ynh_change_url_nginx_config -#REMOVEME? nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf - -# Change the path in the NGINX config file -if [ $change_path -eq 1 ] -then - # Make a backup of the original NGINX config file if modified -#REMOVEME? ynh_backup_if_checksum_is_different --file="$nginx_conf_path" - # Set global variables for NGINX helper -#REMOVEME? domain="$old_domain" -#REMOVEME? path="$new_path" - # Create a dedicated NGINX config -#REMOVEME? ynh_add_nginx_config -fi - -# Change the domain for NGINX -if [ $change_domain -eq 1 ] -then - # Delete file checksum for the old conf file location -#REMOVEME? ynh_delete_file_checksum --file="$nginx_conf_path" -#REMOVEME? mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf - # Store file checksum for the new config file location -#REMOVEME? ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" -fi - -#================================================= -# SPECIFIC MODIFICATIONS -#================================================= -# ... -#================================================= - -#================================================= -# GENERIC FINALISATION -#================================================= -# RELOAD NGINX -#================================================= -#REMOVEME? ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 - -#REMOVEME? #REMOVEME? ynh_systemd_action --service_name=nginx --action=reload - #================================================= # END OF SCRIPT #================================================= ynh_script_progression --message="Change of URL completed for $app" --time --last - From 83c06f922c5a1556c599ece59212b8369bc10d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 15:35:37 +0200 Subject: [PATCH 10/25] Add default test values --- tests.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests.toml b/tests.toml index 0fb9f1f..2c1f45a 100644 --- a/tests.toml +++ b/tests.toml @@ -4,4 +4,7 @@ test_format = 1.0 [default] + args.pixabay = "cafe1007" + args.googleYoutube = "1337c0c4" + test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.name = "First release" From 9aeb75be3d030e55570dd1b5c351b3e2a2af4b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 16:00:25 +0200 Subject: [PATCH 11/25] Fix RAm resources --- manifest.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.toml b/manifest.toml index 58243fa..e68f479 100644 --- a/manifest.toml +++ b/manifest.toml @@ -26,9 +26,9 @@ architectures = "all" multi_instance = true ldap = "not_relevant" sso = "not_relevant" -disk = "50M" -ram.build = "50M" -ram.runtime = "50M" +disk = "100M" +ram.build = "500M" +ram.runtime = "100M" [install] [install.domain] From d32907a76bb6ec51c0d3de356c55d49e2e563649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 16:06:31 +0200 Subject: [PATCH 12/25] Change googleYoutube to apikey_google_youtube, pixabay to apikey_pixabay --- manifest.toml | 4 ++-- scripts/_common.sh | 4 ++-- scripts/upgrade | 14 ++++++++++++++ tests.toml | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/manifest.toml b/manifest.toml index e68f479..3b261f7 100644 --- a/manifest.toml +++ b/manifest.toml @@ -38,7 +38,7 @@ ram.runtime = "100M" type = "path" default = "/digiscreen" - [install.pixabay] + [install.apikey_pixabay] ask.en = "Your Pixabay API key" ask.fr = "Votre clé d’API Pixabay" help.en = "Optional: a Pixabay API key will let you chose a background by entering keywords." @@ -47,7 +47,7 @@ ram.runtime = "100M" example = "123456abc" optional = true - [install.googleYoutube] + [install.apikey_google_youtube] ask.en = "Your Google API key" ask.fr = "Votre clé d’API Google" help.en = "Optional: a Google API key will let you insert videos from Youtube on your Digiscreen" diff --git a/scripts/_common.sh b/scripts/_common.sh index 200b4ff..54cc852 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -12,8 +12,8 @@ nodejs_version="14" _digiscreen_build() { pushd "$install_dir/sources" - echo "VUE_APP_PIXABAY_API_KEY=$pixabay" >> .env - echo "VUE_APP_GOOGLE_API_KEY=$googleYoutube" >> .env + echo "VUE_APP_PIXABAY_API_KEY=$apikey_pixabay" >> .env + echo "VUE_APP_GOOGLE_API_KEY=$apikey_google_youtube" >> .env ynh_use_nodejs "$ynh_npm" install diff --git a/scripts/upgrade b/scripts/upgrade index 42b524a..fec401b 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,20 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 +if [[ -n "${googleYoutube:-}" ]]; then + # migrate camelCase to snake_case + apikey_google_youtube="$googleYoutube" + ynh_app_setting_set --app="$app" --key="apikey_google_youtube" --value="$apikey_google_youtube" + ynh_app_setting_delete --app="$app" --key="googleYoutube" +fi + +if [[ -n "${pixabay:-}" ]]; then + # migrate camelCase to snake_case + apikey_pixabay="$pixabay" + ynh_app_setting_set --app="$app" --key="apikey_pixabay" --value="$apikey_pixabay" + ynh_app_setting_delete --app="$app" --key="pixabay" +fi + #================================================= # INSTALL NODEJS #================================================= diff --git a/tests.toml b/tests.toml index 2c1f45a..fb55e66 100644 --- a/tests.toml +++ b/tests.toml @@ -5,6 +5,6 @@ test_format = 1.0 [default] args.pixabay = "cafe1007" - args.googleYoutube = "1337c0c4" + args.google_youtube = "1337c0c4" test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.name = "First release" From 40585676650604937ad0cf2c8c207c4052e22198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 16:40:53 +0200 Subject: [PATCH 13/25] Fix args for tests --- tests.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests.toml b/tests.toml index fb55e66..1439b11 100644 --- a/tests.toml +++ b/tests.toml @@ -4,7 +4,7 @@ test_format = 1.0 [default] - args.pixabay = "cafe1007" - args.google_youtube = "1337c0c4" + args.apikey_pixabay = "cafe1007" + args.apikey_google_youtube = "1337c0c4" test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.name = "First release" From f32cf1737195f43f481ea33057ecb2e6986e9cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 17:29:58 +0200 Subject: [PATCH 14/25] fix upgrade again... --- scripts/upgrade | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/upgrade b/scripts/upgrade index fec401b..e9c7b57 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,7 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 +googleYoutube="$(ynh_app_setting_get --app="$app" --key=googleYoutube)" if [[ -n "${googleYoutube:-}" ]]; then # migrate camelCase to snake_case apikey_google_youtube="$googleYoutube" @@ -29,6 +30,7 @@ if [[ -n "${googleYoutube:-}" ]]; then ynh_app_setting_delete --app="$app" --key="googleYoutube" fi +pixabay="$(ynh_app_setting_get --app="$app" --key=pixabay)" if [[ -n "${pixabay:-}" ]]; then # migrate camelCase to snake_case apikey_pixabay="$pixabay" From eb576ee329fb108f2e9433632e4e395d3791cb2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Tue, 3 Oct 2023 17:40:01 +0200 Subject: [PATCH 15/25] Add autoupdate to manifest --- .github/workflows/updater.sh | 136 ---------------------------------- .github/workflows/updater.yml | 51 ------------- manifest.toml | 3 + 3 files changed, 3 insertions(+), 187 deletions(-) delete mode 100644 .github/workflows/updater.sh delete mode 100644 .github/workflows/updater.yml diff --git a/.github/workflows/updater.sh b/.github/workflows/updater.sh deleted file mode 100644 index 29d65cc..0000000 --- a/.github/workflows/updater.sh +++ /dev/null @@ -1,136 +0,0 @@ - #!/bin/bash - -#================================================= -# PACKAGE UPDATING HELPER -#================================================= - -# This script is meant to be run by GitHub Actions -# The YunoHost-Apps organisation offers a template Action to run this script periodically -# Since each app is different, maintainers can adapt its contents so as to perform -# automatic actions when a new upstream release is detected. - -# Remove this exit command when you are ready to run this Action -exit 1 - -#================================================= -# FETCHING LATEST RELEASE AND ITS ASSETS -#================================================= - -# Fetching information -current_version=$(cat manifest.json | jq -j '.version|split("~")[0]') -repo=$(cat manifest.json | jq -j '.upstream.code|split("https://github.com/")[1]') -# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions) -version=$(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '.[] | select( .prerelease != true ) | .tag_name' | sort -V | tail -1) -assets=($(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '[ .[] | select(.tag_name=="'$version'").assets[].browser_download_url ] | join(" ") | @sh' | tr -d "'")) - -# Later down the script, we assume the version has only digits and dots -# Sometimes the release name starts with a "v", so let's filter it out. -# You may need more tweaks here if the upstream repository has different naming conventions. -if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then - version=${version:1} -fi - -# Setting up the environment variables -echo "Current version: $current_version" -echo "Latest release from upstream: $version" -echo "VERSION=$version" >> $GITHUB_ENV -# For the time being, let's assume the script will fail -echo "PROCEED=false" >> $GITHUB_ENV - -# Proceed only if the retrieved version is greater than the current one -if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then - echo "::warning ::No new version available" - exit 0 -# Proceed only if a PR for this new version does not already exist -elif git ls-remote -q --exit-code --heads https://github.com/$GITHUB_REPOSITORY.git ci-auto-update-v$version ; then - echo "::warning ::A branch already exists for this update" - exit 0 -fi - -# Each release can hold multiple assets (e.g. binaries for different architectures, source code, etc.) -echo "${#assets[@]} available asset(s)" - -#================================================= -# UPDATE SOURCE FILES -#================================================= - -# Here we use the $assets variable to get the resources published in the upstream release. -# Here is an example for Grav, it has to be adapted in accordance with how the upstream releases look like. - -# Let's loop over the array of assets URLs -for asset_url in ${assets[@]}; do - -echo "Handling asset at $asset_url" - -# Assign the asset to a source file in conf/ directory -# Here we base the source file name upon a unique keyword in the assets url (admin vs. update) -# Leave $src empty to ignore the asset -case $asset_url in - *"admin"*) - src="app" - ;; - *"update"*) - src="app-upgrade" - ;; - *) - src="" - ;; -esac - -# If $src is not empty, let's process the asset -if [ ! -z "$src" ]; then - -# Create the temporary directory -tempdir="$(mktemp -d)" - -# Download sources and calculate checksum -filename=${asset_url##*/} -curl --silent -4 -L $asset_url -o "$tempdir/$filename" -checksum=$(sha256sum "$tempdir/$filename" | head -c 64) - -# Delete temporary directory -rm -rf $tempdir - -# Get extension -if [[ $filename == *.tar.gz ]]; then - extension=tar.gz -else - extension=${filename##*.} -fi - -# Rewrite source file -cat < conf/$src.src -SOURCE_URL=$asset_url -SOURCE_SUM=$checksum -SOURCE_SUM_PRG=sha256sum -SOURCE_FORMAT=$extension -SOURCE_IN_SUBDIR=true -SOURCE_FILENAME= -EOT -echo "... conf/$src.src updated" - -else -echo "... asset ignored" -fi - -done - -#================================================= -# SPECIFIC UPDATE STEPS -#================================================= - -# Any action on the app's source code can be done. -# The GitHub Action workflow takes care of committing all changes after this script ends. - -#================================================= -# GENERIC FINALIZATION -#================================================= - -# Replace new version in manifest -echo "$(jq -s --indent 4 ".[] | .version = \"$version~ynh1\"" manifest.json)" > manifest.json - -# No need to update the README, yunohost-bot takes care of it - -# The Action will proceed only if the PROCEED environment variable is set to true -echo "PROCEED=true" >> $GITHUB_ENV -exit 0 diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml deleted file mode 100644 index 1930250..0000000 --- a/.github/workflows/updater.yml +++ /dev/null @@ -1,51 +0,0 @@ -# This workflow allows GitHub Actions to automagically update your app whenever a new upstream release is detected. -# You need to enable Actions in your repository settings, and fetch this Action from the YunoHost-Apps organization. -# This file should be enough by itself, but feel free to tune it to your needs. -# It calls updater.sh, which is where you should put the app-specific update steps. -name: Check for new upstream releases -on: - # Allow to manually trigger the workflow - workflow_dispatch: - # Run it every day at 6:00 UTC - schedule: - - cron: '0 6 * * *' -jobs: - updater: - runs-on: ubuntu-latest - steps: - - name: Fetch the source code - uses: actions/checkout@v2 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Run the updater script - id: run_updater - env: - GITLAB_AUTOUPDATER_TOKEN: ${{ secrets.GITLAB_AUTOUPDATER_TOKEN }} - run: | - # Setting up Git user - git config --global user.name 'yunohost-bot' - git config --global user.email 'yunohost-bot@users.noreply.github.com' - # Run the updater script - /bin/bash .github/workflows/updater.sh - - name: Commit changes - id: commit - if: ${{ env.PROCEED == 'true' }} - run: | - git commit -am "Upgrade to v$VERSION" - - name: Create Pull Request - id: cpr - if: ${{ env.PROCEED == 'true' }} - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: Update to version ${{ env.VERSION }} - committer: 'yunohost-bot ' - author: 'yunohost-bot ' - signoff: false - base: testing - branch: ci-auto-update-v${{ env.VERSION }} - delete-branch: true - title: 'Upgrade to version ${{ env.VERSION }}' - body: | - Upgrade to v${{ env.VERSION }} - draft: false diff --git a/manifest.toml b/manifest.toml index 3b261f7..b75b9e1 100644 --- a/manifest.toml +++ b/manifest.toml @@ -67,6 +67,9 @@ ram.runtime = "100M" url = "https://github.com/YunoHost-Apps/digiscreen_ynh/releases/download/0.6.4/digiscreen-0.6.4.zip" sha256 = "92273e360e06639283ee9db746d1d53006af7ea405f1ecbe85a262b39eae6756" + autoupdate.strategy = "latest_github_tag" + autoupdate.asset = "digiscreen.*.zip" + [resources.system_user] [resources.install_dir] From 3f79aeed217aba619bb064d80700be6634586419 Mon Sep 17 00:00:00 2001 From: Salamandar <6552989+Salamandar@users.noreply.github.com> Date: Wed, 4 Oct 2023 12:25:24 +0200 Subject: [PATCH 16/25] Update description Co-authored-by: eric_G <46165813+ericgaspar@users.noreply.github.com> --- manifest.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest.toml b/manifest.toml index b75b9e1..c85536c 100644 --- a/manifest.toml +++ b/manifest.toml @@ -4,8 +4,8 @@ packaging_format = 2 id = "digiscreen" name = "Digiscreen" -description.en = "An interactive wallpaper for the classroom, face-to-face or distant" -description.fr = "Un fond d'écran interactif pour la salle de classe en présence ou à distance." +description.en = "Interactive wallpaper for the classroom, face-to-face or distant" +description.fr = "Fond d'écran interactif pour la salle de classe en présence ou à distance" version = "0.6.4~ynh1" @@ -21,7 +21,7 @@ code = "https://codeberg.org/ladigitale/digiscreen" fund = "https://opencollective.com/ladigitale" [integration] -yunohost = ">= 11.0.10" +yunohost = ">= 11.2" architectures = "all" multi_instance = true ldap = "not_relevant" @@ -50,15 +50,15 @@ ram.runtime = "100M" [install.apikey_google_youtube] ask.en = "Your Google API key" ask.fr = "Votre clé d’API Google" - help.en = "Optional: a Google API key will let you insert videos from Youtube on your Digiscreen" - help.fr = "Optionnel : une clé d’API Google vous permettra d’afficher des vidéos de Youtube sur votre Digiscreen." + help.en = "Optional: a Google API key will let you insert videos from YouTube on your Digiscreen" + help.fr = "Optionnel : une clé d’API Google vous permettra d’afficher des vidéos de YouTube sur votre Digiscreen." type = "string" example = "123456abc" optional = true [install.init_main_permission] - help.en = "If public, any visitor can use this app and thus will benefit from your API keys for Pixabay and Youtube." - help.fr = "Si l’application est publique, n’importe quel visiteur pourra utiliser cette application et bénéficiera donc de vos clés d’API pour Pixabay et Youtube." + help.en = "If public, any visitor can use this app and thus will benefit from your API keys for Pixabay and YouTube." + help.fr = "Si l’application est publique, n’importe quel visiteur pourra utiliser cette application et bénéficiera donc de vos clés d’API pour Pixabay et YouTube." type = "group" default = "visitors" From 4a91309b65f75c416d2cc90a7d327dcd2efb12d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Pi=C3=A9dallu?= Date: Wed, 4 Oct 2023 13:21:38 +0200 Subject: [PATCH 17/25] Fix upgrade --- scripts/upgrade | 20 ++++++++++---------- tests.toml | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index e9c7b57..ef09b20 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,22 +22,22 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 -googleYoutube="$(ynh_app_setting_get --app="$app" --key=googleYoutube)" -if [[ -n "${googleYoutube:-}" ]]; then - # migrate camelCase to snake_case - apikey_google_youtube="$googleYoutube" - ynh_app_setting_set --app="$app" --key="apikey_google_youtube" --value="$apikey_google_youtube" - ynh_app_setting_delete --app="$app" --key="googleYoutube" -fi - -pixabay="$(ynh_app_setting_get --app="$app" --key=pixabay)" -if [[ -n "${pixabay:-}" ]]; then +# migrate camelCase to snake_case +if [[ -z "$apikey_pixabay" ]]; then # migrate camelCase to snake_case + pixabay="$(ynh_app_setting_get --app="$app" --key=pixabay)" apikey_pixabay="$pixabay" ynh_app_setting_set --app="$app" --key="apikey_pixabay" --value="$apikey_pixabay" ynh_app_setting_delete --app="$app" --key="pixabay" fi +if [[ -z "$apikey_google_youtube" ]]; then + googleYoutube="$(ynh_app_setting_get --app="$app" --key=googleYoutube)" + apikey_google_youtube="$googleYoutube" + ynh_app_setting_set --app="$app" --key="apikey_google_youtube" --value="$apikey_google_youtube" + ynh_app_setting_delete --app="$app" --key="googleYoutube" +fi + #================================================= # INSTALL NODEJS #================================================= diff --git a/tests.toml b/tests.toml index 1439b11..3be94b0 100644 --- a/tests.toml +++ b/tests.toml @@ -8,3 +8,5 @@ test_format = 1.0 args.apikey_google_youtube = "1337c0c4" test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.name = "First release" + test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.args.pixabay = "cafe1007" + test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.args.googleYoutube = "1337c0c4" From 74d0cbe2cdca18ca1691788d828c864820ccb2a2 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sat, 25 Nov 2023 09:22:00 +0100 Subject: [PATCH 18/25] cleaning --- manifest.toml | 3 +++ scripts/_common.sh | 4 ++-- scripts/install | 9 ++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest.toml b/manifest.toml index c85536c..f864781 100644 --- a/manifest.toml +++ b/manifest.toml @@ -24,8 +24,11 @@ fund = "https://opencollective.com/ladigitale" yunohost = ">= 11.2" architectures = "all" multi_instance = true + ldap = "not_relevant" + sso = "not_relevant" + disk = "100M" ram.build = "500M" ram.runtime = "100M" diff --git a/scripts/_common.sh b/scripts/_common.sh index 54cc852..09b0461 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -16,8 +16,8 @@ _digiscreen_build() { echo "VUE_APP_GOOGLE_API_KEY=$apikey_google_youtube" >> .env ynh_use_nodejs - "$ynh_npm" install - "$ynh_npm" run build + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH $ynh_npm install + ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH $ynh_npm run build popd } diff --git a/scripts/install b/scripts/install index 042bf33..7c6053f 100644 --- a/scripts/install +++ b/scripts/install @@ -24,6 +24,10 @@ ynh_script_progression --message="Setting up source files..." --weight=1 # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$install_dir/sources" +chmod 750 "$install_dir" +chmod -R o-rwx "$install_dir" +chown -R "$app:www-data" "$install_dir" + _digiscreen_build mv "$install_dir/sources/dist" "$install_dir/www" @@ -40,11 +44,6 @@ ynh_script_progression --message="Configuring NGINX web server..." --weight=1 ynh_add_nginx_config -#================================================= -# PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Configuring PHP-FPM..." --weight=1 - ynh_add_fpm_config #================================================= From 198ef5b1e0f225a7408a1c36caa8f67d8ad76a33 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 25 Nov 2023 08:22:10 +0000 Subject: [PATCH 19/25] Auto-update README --- README.md | 1 + README_fr.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 27fd75e..c6a8628 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation * Official user documentation: * Official admin documentation: * Upstream app code repository: +* YunoHost Store: * Report a bug: ## Developer info diff --git a/README_fr.md b/README_fr.md index 260fa71..0f8b886 100644 --- a/README_fr.md +++ b/README_fr.md @@ -48,6 +48,7 @@ Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation * Documentation officielle utilisateur : * Documentation officielle de l’admin : * Dépôt de code officiel de l’app : +* YunoHost Store: * Signaler un bug : ## Informations pour les développeurs From 767fd0c1b733dabe032cf4eb0bcc8b45ba767945 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 25 Nov 2023 08:22:42 +0000 Subject: [PATCH 20/25] Auto-update README --- README_fr.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README_fr.md b/README_fr.md index 17d9b62..0f8b886 100644 --- a/README_fr.md +++ b/README_fr.md @@ -14,6 +14,25 @@ It shall NOT be edited by hand. > *Ce package vous permet d’installer Digiscreen rapidement et simplement sur un serveur YunoHost. Si vous n’avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l’installer et en profiter.* +## Vue d’ensemble + +Digiscreen est un fond d'écran interactif pour la salle de classe en présence ou à distance. + +Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation de leurs cours, Digiscreen propose un ensemble d'outils pratiques sous forme de modules : + +* générateur de codes QR ; +* affichage de textes, d'images et de fichiers audio en ligne ; +* dessin ; +* diffusion et découpage de vidéos YouTube ; +* chronomètre et compte à rebours ; +* générateur de nuages de mots ; +* synthèse vocale ; +* exercices interactifs : remise en ordre et texte à trous ; +* contenus intégrés : sites Web, documents en ligne et contenus interactifs (LearningApps par exemple) ; +* capture d'écran ; +* annotation ; +* et d'autres à venir 🙂. + **Version incluse :** 0.6.4~ynh1 From 9e4b4c983d9f5657b176d1b1a9431e5723c65535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 14 Jan 2024 13:09:14 +0100 Subject: [PATCH 21/25] fix --- conf/{php-fpm.conf => extra_php-fpm.conf} | 0 conf/nginx.conf | 2 -- manifest.toml | 11 ++++------- scripts/backup | 4 ---- scripts/remove | 14 +------------- scripts/restore | 12 ++---------- scripts/upgrade | 5 ----- 7 files changed, 7 insertions(+), 41 deletions(-) rename conf/{php-fpm.conf => extra_php-fpm.conf} (100%) diff --git a/conf/php-fpm.conf b/conf/extra_php-fpm.conf similarity index 100% rename from conf/php-fpm.conf rename to conf/extra_php-fpm.conf diff --git a/conf/nginx.conf b/conf/nginx.conf index 7104a76..09eb7a9 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -4,7 +4,6 @@ location __PATH__/ { # Path to source alias __INSTALL_DIR__/www/; -### Example PHP configuration (remove it if not used) index index.html index.php; # Common parameter to increase upload size limit in conjunction with dedicated php-fpm file @@ -21,7 +20,6 @@ location __PATH__/ { fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $request_filename; } -### End of PHP configuration part # Include SSOWAT user panel. include conf.d/yunohost_panel.conf.inc; diff --git a/manifest.toml b/manifest.toml index f864781..cc81848 100644 --- a/manifest.toml +++ b/manifest.toml @@ -25,9 +25,9 @@ yunohost = ">= 11.2" architectures = "all" multi_instance = true -ldap = "not_relevant" +ldap = false -sso = "not_relevant" +sso = false disk = "100M" ram.build = "500M" @@ -67,11 +67,8 @@ ram.runtime = "100M" [resources] [resources.sources.main] - url = "https://github.com/YunoHost-Apps/digiscreen_ynh/releases/download/0.6.4/digiscreen-0.6.4.zip" - sha256 = "92273e360e06639283ee9db746d1d53006af7ea405f1ecbe85a262b39eae6756" - - autoupdate.strategy = "latest_github_tag" - autoupdate.asset = "digiscreen.*.zip" + url = "https://codeberg.org/ladigitale/digiscreen/releases/download/0.9.13/digiscreen-v0.9.13.zip" + sha256 = "" [resources.system_user] diff --git a/scripts/backup b/scripts/backup index 18f83fe..c5c603d 100644 --- a/scripts/backup +++ b/scripts/backup @@ -27,10 +27,6 @@ ynh_backup --src_path="$install_dir" ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" -#================================================= -# BACKUP THE PHP-FPM CONFIGURATION -#================================================= - ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" #================================================= diff --git a/scripts/remove b/scripts/remove index e8daf85..b1a799f 100644 --- a/scripts/remove +++ b/scripts/remove @@ -1,4 +1,4 @@ - #!/bin/bash +#!/bin/bash #================================================= # GENERIC START @@ -17,21 +17,9 @@ ynh_script_progression --message="Removing NGINX web server configuration..." -- # Remove the dedicated NGINX config ynh_remove_nginx_config -#================================================= -# REMOVE PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=1 - # Remove the dedicated PHP-FPM config ynh_remove_fpm_config -#================================================= -# SPECIFIC REMOVE -#================================================= -# REMOVE VARIOUS FILES -#================================================= -ynh_script_progression --message="Removing various files..." --weight=1 - # Remove the log files ynh_secure_remove --file="/var/log/$app" diff --git a/scripts/restore b/scripts/restore index c5cc706..cf2ad9d 100644 --- a/scripts/restore +++ b/scripts/restore @@ -10,15 +10,6 @@ source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -#================================================= -# STANDARD RESTORATION STEPS -#================================================= -# RESTORE THE NGINX CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the NGINX web server configuration..." --weight=1 - -ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" - #================================================= # RESTORE THE APP MAIN DIR #================================================= @@ -26,7 +17,6 @@ ynh_script_progression --message="Restoring the app main directory..." --weight= ynh_restore_file --origin_path="$install_dir" -chmod 750 "$install_dir" chmod -R o-rwx "$install_dir" chown -R "$app:www-data" "$install_dir" @@ -37,6 +27,8 @@ ynh_script_progression --message="Restoring the PHP-FPM configuration..." --weig ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" + #================================================= # GENERIC FINALIZATION #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index ef09b20..80875b6 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -85,11 +85,6 @@ ynh_script_progression --message="Upgrading NGINX web server configuration..." - # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# PHP-FPM CONFIGURATION -#================================================= -ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=1 - ynh_add_fpm_config #================================================= From 5667a797d9706219d0c6e1f093e87ecb82888a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 14 Jan 2024 13:10:16 +0100 Subject: [PATCH 22/25] Update manifest.toml --- manifest.toml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/manifest.toml b/manifest.toml index cc81848..8c0f5b4 100644 --- a/manifest.toml +++ b/manifest.toml @@ -7,7 +7,7 @@ name = "Digiscreen" description.en = "Interactive wallpaper for the classroom, face-to-face or distant" description.fr = "Fond d'écran interactif pour la salle de classe en présence ou à distance" -version = "0.6.4~ynh1" +version = "0.9.13~ynh1" maintainers = ["Pierre-Amiel Giraud"] @@ -68,25 +68,17 @@ ram.runtime = "100M" [resources] [resources.sources.main] url = "https://codeberg.org/ladigitale/digiscreen/releases/download/0.9.13/digiscreen-v0.9.13.zip" - sha256 = "" + sha256 = "9e0864e8b14140b5d8d7257b380bf65d4e8dfde8a467492c6516a30b53209ed5" [resources.system_user] [resources.install_dir] - [resources.data_dir] - [resources.permissions] main.url = "/" [resources.ports] [resources.apt] - packages = [ - "mariadb-server", - "php8.2", - "php8.2-fpm", - ] + packages = ["php8.2-fpm"] - [resources.database] - type = "mysql" From dbf420457d12494c7e074a64152f0434c79705e6 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sun, 14 Jan 2024 12:10:21 +0000 Subject: [PATCH 23/25] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c6a8628..a96d088 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation * et d'autres à venir 🙂. -**Shipped version:** 0.6.4~ynh1 +**Shipped version:** 0.9.13~ynh1 **Demo:** https://ladigitale.dev/digiscreen/ diff --git a/README_fr.md b/README_fr.md index 0f8b886..65436d0 100644 --- a/README_fr.md +++ b/README_fr.md @@ -34,7 +34,7 @@ Conçu pour accompagner les enseignants (de langues, notamment) dans l'animation * et d'autres à venir 🙂. -**Version incluse :** 0.6.4~ynh1 +**Version incluse :** 0.9.13~ynh1 **Démo :** https://ladigitale.dev/digiscreen/ From 8f24e8a95a01b60f2188ef5035efa2c32f345ec0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 14 Jan 2024 13:12:24 +0100 Subject: [PATCH 24/25] fix --- manifest.toml | 23 ++----------------- scripts/_common.sh | 13 ----------- scripts/install | 18 --------------- scripts/remove | 5 ---- scripts/upgrade | 57 ++-------------------------------------------- tests.toml | 7 ------ 6 files changed, 4 insertions(+), 119 deletions(-) diff --git a/manifest.toml b/manifest.toml index 8c0f5b4..aea43bc 100644 --- a/manifest.toml +++ b/manifest.toml @@ -34,6 +34,7 @@ ram.build = "500M" ram.runtime = "100M" [install] + [install.domain] type = "domain" @@ -41,27 +42,7 @@ ram.runtime = "100M" type = "path" default = "/digiscreen" - [install.apikey_pixabay] - ask.en = "Your Pixabay API key" - ask.fr = "Votre clé d’API Pixabay" - help.en = "Optional: a Pixabay API key will let you chose a background by entering keywords." - help.fr = "Optionnel : une clé d’API Pixabay vous permettra de choisir un fond d’écran en entrant un mot clé." - type = "string" - example = "123456abc" - optional = true - - [install.apikey_google_youtube] - ask.en = "Your Google API key" - ask.fr = "Votre clé d’API Google" - help.en = "Optional: a Google API key will let you insert videos from YouTube on your Digiscreen" - help.fr = "Optionnel : une clé d’API Google vous permettra d’afficher des vidéos de YouTube sur votre Digiscreen." - type = "string" - example = "123456abc" - optional = true - [install.init_main_permission] - help.en = "If public, any visitor can use this app and thus will benefit from your API keys for Pixabay and YouTube." - help.fr = "Si l’application est publique, n’importe quel visiteur pourra utiliser cette application et bénéficiera donc de vos clés d’API pour Pixabay et YouTube." type = "group" default = "visitors" @@ -80,5 +61,5 @@ ram.runtime = "100M" [resources.ports] [resources.apt] - packages = ["php8.2-fpm"] + packages = "php8.2-sqlite3" diff --git a/scripts/_common.sh b/scripts/_common.sh index 09b0461..944a65e 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -4,23 +4,10 @@ # COMMON VARIABLES #================================================= -nodejs_version="14" - #================================================= # PERSONAL HELPERS #================================================= -_digiscreen_build() { - pushd "$install_dir/sources" - echo "VUE_APP_PIXABAY_API_KEY=$apikey_pixabay" >> .env - echo "VUE_APP_GOOGLE_API_KEY=$apikey_google_youtube" >> .env - - ynh_use_nodejs - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH $ynh_npm install - ynh_exec_warn_less sudo -u $app env $ynh_node_load_PATH $ynh_npm run build - popd -} - #================================================= # EXPERIMENTAL HELPERS #================================================= diff --git a/scripts/install b/scripts/install index 7c6053f..cf216ee 100644 --- a/scripts/install +++ b/scripts/install @@ -9,31 +9,13 @@ source _common.sh source /usr/share/yunohost/helpers -#================================================= -# INSTALL NODEJS -#================================================= -ynh_script_progression --message="Installing NodeJS..." --weight 3 - -ynh_install_nodejs --nodejs_version="$nodejs_version" - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= ynh_script_progression --message="Setting up source files..." --weight=1 -# Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$install_dir/sources" -chmod 750 "$install_dir" -chmod -R o-rwx "$install_dir" -chown -R "$app:www-data" "$install_dir" - -_digiscreen_build - -mv "$install_dir/sources/dist" "$install_dir/www" -ynh_secure_remove --file="$install_dir/sources" - -chmod 750 "$install_dir" chmod -R o-rwx "$install_dir" chown -R "$app:www-data" "$install_dir" diff --git a/scripts/remove b/scripts/remove index b1a799f..ac762c0 100644 --- a/scripts/remove +++ b/scripts/remove @@ -14,15 +14,10 @@ source /usr/share/yunohost/helpers #================================================= ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 -# Remove the dedicated NGINX config ynh_remove_nginx_config -# Remove the dedicated PHP-FPM config ynh_remove_fpm_config -# Remove the log files -ynh_secure_remove --file="/var/log/$app" - #================================================= # END OF SCRIPT #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index 80875b6..cbaab26 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -15,65 +15,13 @@ source /usr/share/yunohost/helpers upgrade_type=$(ynh_check_app_version_changed) -#================================================= -# STANDARD UPGRADE STEPS -#================================================= -# ENSURE DOWNWARD COMPATIBILITY -#================================================= -ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 - -# migrate camelCase to snake_case -if [[ -z "$apikey_pixabay" ]]; then - # migrate camelCase to snake_case - pixabay="$(ynh_app_setting_get --app="$app" --key=pixabay)" - apikey_pixabay="$pixabay" - ynh_app_setting_set --app="$app" --key="apikey_pixabay" --value="$apikey_pixabay" - ynh_app_setting_delete --app="$app" --key="pixabay" -fi - -if [[ -z "$apikey_google_youtube" ]]; then - googleYoutube="$(ynh_app_setting_get --app="$app" --key=googleYoutube)" - apikey_google_youtube="$googleYoutube" - ynh_app_setting_set --app="$app" --key="apikey_google_youtube" --value="$apikey_google_youtube" - ynh_app_setting_delete --app="$app" --key="googleYoutube" -fi - -#================================================= -# INSTALL NODEJS -#================================================= -ynh_script_progression --message="Installing NodeJS..." --weight 3 - -ynh_install_nodejs --nodejs_version="$nodejs_version" - #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= +ynh_script_progression --message="Upgrading source files..." --weight=1 -if [ "$upgrade_type" == "UPGRADE_APP" ] -then - ynh_script_progression --message="Upgrading source files..." --weight=1 +ynh_setup_source --dest_dir="$install_dir" --keep="inc/digiwords.db" - ynh_setup_source --dest_dir="$install_dir/sources" - - _digiscreen_build - - # backup... - if [ -f "$install_dir/www/inc/digiwords.db" ]; then - mv "$install_dir/www/inc/digiwords.db" "$install_dir" - fi - - # upgrade... - ynh_secure_remove --file="$install_dir/www" - mv "$install_dir/sources/dist" "$install_dir/www" - - if [ -f "$install_dir/digiwords.db" ]; then - # restore - mkdir -p "$install_dir/www/inc" - mv "$install_dir/digiwords.db" "$install_dir/www/inc" - fi -fi - -chmod 750 "$install_dir" chmod -R o-rwx "$install_dir" chown -R "$app:www-data" "$install_dir" @@ -82,7 +30,6 @@ chown -R "$app:www-data" "$install_dir" #================================================= ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 -# Create a dedicated NGINX config ynh_add_nginx_config ynh_add_fpm_config diff --git a/tests.toml b/tests.toml index 3be94b0..94abb79 100644 --- a/tests.toml +++ b/tests.toml @@ -3,10 +3,3 @@ test_format = 1.0 [default] - - args.apikey_pixabay = "cafe1007" - args.apikey_google_youtube = "1337c0c4" - - test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.name = "First release" - test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.args.pixabay = "cafe1007" - test_upgrade_from.3bb42cd71bcca77b7f642859bf5048317586a500.args.googleYoutube = "1337c0c4" From 53ce863f297042635dcba2947576850fda95bb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?E=CC=81ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Sun, 14 Jan 2024 13:19:56 +0100 Subject: [PATCH 25/25] Update extra_php-fpm.conf --- conf/extra_php-fpm.conf | 432 +--------------------------------------- 1 file changed, 3 insertions(+), 429 deletions(-) diff --git a/conf/extra_php-fpm.conf b/conf/extra_php-fpm.conf index c487766..700c37c 100644 --- a/conf/extra_php-fpm.conf +++ b/conf/extra_php-fpm.conf @@ -1,430 +1,4 @@ -; Start a new pool named 'www'. -; the variable $pool can be used in any directive and will be replaced by the -; pool name ('www' here) -[__NAMETOCHANGE__] +; Additional php.ini defines, specific to this pool of workers. -; Per pool prefix -; It only applies on the following directives: -; - 'access.log' -; - 'slowlog' -; - 'listen' (unixsocket) -; - 'chroot' -; - 'chdir' -; - 'php_values' -; - 'php_admin_values' -; When not set, the global prefix (or /usr) applies instead. -; Note: This directive can also be relative to the global prefix. -; Default Value: none -;prefix = /path/to/pools/$pool - -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = __USER__ -group = __USER__ - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock - -; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 511 - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = www-data -listen.group = www-data -;listen.mode = 0660 -; When POSIX Access Control Lists are supported you can set them using -; these options, value is a comma separated list of user/group names. -; When set, listen.owner and listen.group are ignored -;listen.acl_users = -;listen.acl_groups = - -; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. -; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original -; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address -; must be separated by a comma. If this value is left blank, connections will be -; accepted from any ip address. -; Default Value: any -;listen.allowed_clients = 127.0.0.1 - -; Specify the nice(2) priority to apply to the pool processes (only if set) -; The value can vary from -19 (highest priority) to 20 (lower priority) -; Note: - It will only work if the FPM master process is launched as root -; - The pool processes will inherit the master process priority -; unless it specified otherwise -; Default Value: no set -; process.priority = -19 - -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user -; or group is differrent than the master process user. It allows to create process -; core dump and ptrace the process for the pool user. -; Default Value: no -; process.dumpable = yes - -; Choose how the process manager will control the number of child processes. -; Possible Values: -; static - a fixed number (pm.max_children) of child processes; -; dynamic - the number of child processes are set dynamically based on the -; following directives. With this process management, there will be -; always at least 1 children. -; pm.max_children - the maximum number of children that can -; be alive at the same time. -; pm.start_servers - the number of children created on startup. -; pm.min_spare_servers - the minimum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is less than this -; number then some children will be created. -; pm.max_spare_servers - the maximum number of children in 'idle' -; state (waiting to process). If the number -; of 'idle' processes is greater than this -; number then some children will be killed. -; ondemand - no children are created at startup. Children will be forked when -; new requests will connect. The following parameter are used: -; pm.max_children - the maximum number of children that -; can be alive at the same time. -; pm.process_idle_timeout - The number of seconds after which -; an idle process will be killed. -; Note: This value is mandatory. -pm = dynamic - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = 5 - -; The number of child processes created on startup. -; Note: Used only when pm is set to 'dynamic' -; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 2 - -; The desired minimum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.min_spare_servers = 1 - -; The desired maximum number of idle server processes. -; Note: Used only when pm is set to 'dynamic' -; Note: Mandatory when pm is set to 'dynamic' -pm.max_spare_servers = 3 - -; The number of seconds after which an idle process will be killed. -; Note: Used only when pm is set to 'ondemand' -; Default Value: 10s -;pm.process_idle_timeout = 10s; - -; The number of requests each child process should execute before respawning. -; This can be useful to work around memory leaks in 3rd party libraries. For -; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. -; Default Value: 0 -;pm.max_requests = 500 - -; The URI to view the FPM status page. If this value is not set, no URI will be -; recognized as a status page. It shows the following informations: -; pool - the name of the pool; -; process manager - static, dynamic or ondemand; -; start time - the date and time FPM has started; -; start since - number of seconds since FPM has started; -; accepted conn - the number of request accepted by the pool; -; listen queue - the number of request in the queue of pending -; connections (see backlog in listen(2)); -; max listen queue - the maximum number of requests in the queue -; of pending connections since FPM has started; -; listen queue len - the size of the socket queue of pending connections; -; idle processes - the number of idle processes; -; active processes - the number of active processes; -; total processes - the number of idle + active processes; -; max active processes - the maximum number of active processes since FPM -; has started; -; max children reached - number of times, the process limit has been reached, -; when pm tries to start more children (works only for -; pm 'dynamic' and 'ondemand'); -; Value are updated in real time. -; Example output: -; pool: www -; process manager: static -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 62636 -; accepted conn: 190460 -; listen queue: 0 -; max listen queue: 1 -; listen queue len: 42 -; idle processes: 4 -; active processes: 11 -; total processes: 15 -; max active processes: 12 -; max children reached: 0 -; -; By default the status page output is formatted as text/plain. Passing either -; 'html', 'xml' or 'json' in the query string will return the corresponding -; output syntax. Example: -; http://www.foo.bar/status -; http://www.foo.bar/status?json -; http://www.foo.bar/status?html -; http://www.foo.bar/status?xml -; -; By default the status page only outputs short status. Passing 'full' in the -; query string will also return status for each pool process. -; Example: -; http://www.foo.bar/status?full -; http://www.foo.bar/status?json&full -; http://www.foo.bar/status?html&full -; http://www.foo.bar/status?xml&full -; The Full status returns for each process: -; pid - the PID of the process; -; state - the state of the process (Idle, Running, ...); -; start time - the date and time the process has started; -; start since - the number of seconds since the process has started; -; requests - the number of requests the process has served; -; request duration - the duration in µs of the requests; -; request method - the request method (GET, POST, ...); -; request URI - the request URI with the query string; -; content length - the content length of the request (only with POST); -; user - the user (PHP_AUTH_USER) (or '-' if not set); -; script - the main script called (or '-' if not set); -; last request cpu - the %cpu the last request consumed -; it's always 0 if the process is not in Idle state -; because CPU calculation is done when the request -; processing has terminated; -; last request memory - the max amount of memory the last request consumed -; it's always 0 if the process is not in Idle state -; because memory calculation is done when the request -; processing has terminated; -; If the process is in Idle state, then informations are related to the -; last request the process has served. Otherwise informations are related to -; the current request being served. -; Example output: -; ************************ -; pid: 31330 -; state: Running -; start time: 01/Jul/2011:17:53:49 +0200 -; start since: 63087 -; requests: 12808 -; request duration: 1250261 -; request method: GET -; request URI: /test_mem.php?N=10000 -; content length: 0 -; user: - -; script: /home/fat/web/docs/php/test_mem.php -; last request cpu: 0.00 -; last request memory: 0 -; -; Note: There is a real-time FPM status monitoring sample web page available -; It's available in: /usr/share/php/7.0/fpm/status.html -; -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;pm.status_path = /status - -; The ping URI to call the monitoring page of FPM. If this value is not set, no -; URI will be recognized as a ping page. This could be used to test from outside -; that FPM is alive and responding, or to -; - create a graph of FPM availability (rrd or such); -; - remove a server from a group if it is not responding (load balancing); -; - trigger alerts for the operating team (24/7). -; Note: The value must start with a leading slash (/). The value can be -; anything, but it may not be a good idea to use the .php extension or it -; may conflict with a real PHP file. -; Default Value: not set -;ping.path = /ping - -; This directive may be used to customize the response of a ping request. The -; response is formatted as text/plain with a 200 response code. -; Default Value: pong -;ping.response = pong - -; The access log file -; Default: not set -;access.log = log/$pool.access.log - -; The access log format. -; The following syntax is allowed -; %%: the '%' character -; %C: %CPU used by the request -; it can accept the following format: -; - %{user}C for user CPU only -; - %{system}C for system CPU only -; - %{total}C for user + system CPU (default) -; %d: time taken to serve the request -; it can accept the following format: -; - %{seconds}d (default) -; - %{miliseconds}d -; - %{mili}d -; - %{microseconds}d -; - %{micro}d -; %e: an environment variable (same as $_ENV or $_SERVER) -; it must be associated with embraces to specify the name of the env -; variable. Some exemples: -; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e -; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e -; %f: script filename -; %l: content-length of the request (for POST request only) -; %m: request method -; %M: peak of memory allocated by PHP -; it can accept the following format: -; - %{bytes}M (default) -; - %{kilobytes}M -; - %{kilo}M -; - %{megabytes}M -; - %{mega}M -; %n: pool name -; %o: output header -; it must be associated with embraces to specify the name of the header: -; - %{Content-Type}o -; - %{X-Powered-By}o -; - %{Transfert-Encoding}o -; - .... -; %p: PID of the child that serviced the request -; %P: PID of the parent of the child that serviced the request -; %q: the query string -; %Q: the '?' character if query string exists -; %r: the request URI (without the query string, see %q and %Q) -; %R: remote IP address -; %s: status (response code) -; %t: server time the request was received -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %T: time the log has been written (the request has finished) -; it can accept a strftime(3) format: -; %d/%b/%Y:%H:%M:%S %z (default) -; The strftime(3) format must be encapsuled in a %{}t tag -; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t -; %u: remote user -; -; Default: "%R - %u %t \"%m %r\" %s" -;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" - -; The log file for slow requests -; Default Value: not set -; Note: slowlog is mandatory if request_slowlog_timeout is set -;slowlog = log/$pool.log.slow - -; The timeout for serving a single request after which a PHP backtrace will be -; dumped to the 'slowlog' file. A value of '0s' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -;request_slowlog_timeout = 0 - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = 1d - -; Set open file descriptor rlimit. -; Default Value: system defined value -;rlimit_files = 1024 - -; Set max core size rlimit. -; Possible Values: 'unlimited' or an integer greater or equal to 0 -; Default Value: system defined value -;rlimit_core = 0 - -; Chroot to this directory at the start. This value must be defined as an -; absolute path. When this value is not set, chroot is not used. -; Note: you can prefix with '$prefix' to chroot to the pool prefix or one -; of its subdirectories. If the pool prefix is not set, the global prefix -; will be used instead. -; Note: chrooting is a great security feature and should be used whenever -; possible. However, all PHP paths will be relative to the chroot -; (error_log, sessions.save_path, ...). -; Default Value: not set -;chroot = - -; Chdir to this directory at the start. -; Note: relative path can be used. -; Default Value: current directory or / when chroot -chdir = __INSTALL_DIR__/www - -; Redirect worker stdout and stderr into main error log. If not set, stdout and -; stderr will be redirected to /dev/null according to FastCGI specs. -; Note: on highloaded environement, this can cause some delay in the page -; process time (several ms). -; Default Value: no -;catch_workers_output = yes - -; Clear environment in FPM workers -; Prevents arbitrary environment variables from reaching FPM worker processes -; by clearing the environment in workers before env vars specified in this -; pool configuration are added. -; Setting to "no" will make all environment variables available to PHP code -; via getenv(), $_ENV and $_SERVER. -; Default Value: yes -;clear_env = no - -; Limits the extensions of the main script FPM will allow to parse. This can -; prevent configuration mistakes on the web server side. You should only limit -; FPM to .php extensions to prevent malicious users to use other extensions to -; execute php code. -; Note: set an empty value to allow all extensions. -; Default Value: .php -;security.limit_extensions = .php .php3 .php4 .php5 .php7 - -; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from -; the current environment. -; Default Value: clean env -;env[HOSTNAME] = $HOSTNAME -;env[PATH] = /usr/local/bin:/usr/bin:/bin -;env[TMP] = /tmp -;env[TMPDIR] = /tmp -;env[TEMP] = /tmp - -; Additional php.ini defines, specific to this pool of workers. These settings -; overwrite the values previously defined in the php.ini. The directives are the -; same as the PHP SAPI: -; php_value/php_flag - you can set classic ini defines which can -; be overwritten from PHP call 'ini_set'. -; php_admin_value/php_admin_flag - these directives won't be overwritten by -; PHP call 'ini_set' -; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. - -; Defining 'extension' will load the corresponding shared extension from -; extension_dir. Defining 'disable_functions' or 'disable_classes' will not -; overwrite previously defined php.ini values, but will append the new value -; instead. - -; Note: path INI options can be relative and will be expanded with the prefix -; (pool, global or /usr) - -; Default Value: nothing is defined by default except the values in php.ini and -; specified at startup with the -d argument -;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com -;php_flag[display_errors] = off -;php_admin_value[error_log] = /var/log/fpm-php.www.log -;php_admin_flag[log_errors] = on -;php_admin_value[memory_limit] = 32M - -; Common values to change to increase file upload limit -; php_admin_value[upload_max_filesize] = 50M -; php_admin_value[post_max_size] = 50M -; php_admin_flag[mail.add_x_header] = Off - -; Other common parameters -; php_admin_value[max_execution_time] = 600 -; php_admin_value[max_input_time] = 300 -; php_admin_value[memory_limit] = 256M -; php_admin_flag[short_open_tag] = On +php_admin_value[upload_max_filesize] = 50M +php_admin_value[post_max_size] = 50M