From aed0a0700588189c60cbf1917e3744c90d1f2bc7 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Wed, 12 Oct 2022 18:51:51 +0200 Subject: [PATCH 01/32] [ADD] new module web_theme_classic to identify better buttons and fields in Odoo form views --- web_theme_classic/README.rst | 0 web_theme_classic/__init__.py | 0 web_theme_classic/__manifest__.py | 24 +++++ web_theme_classic/readme/CONTRIBUTORS.rst | 1 + web_theme_classic/readme/DESCRIPTION.rst | 21 ++++ web_theme_classic/readme/ROADMAP.rst | 2 + .../product_template_form_with_module.png | Bin 0 -> 58115 bytes .../product_template_form_without_module.png | Bin 0 -> 63244 bytes .../static/src/scss/web_theme_classic.scss | 92 ++++++++++++++++++ 9 files changed, 140 insertions(+) create mode 100644 web_theme_classic/README.rst create mode 100644 web_theme_classic/__init__.py create mode 100644 web_theme_classic/__manifest__.py create mode 100644 web_theme_classic/readme/CONTRIBUTORS.rst create mode 100644 web_theme_classic/readme/DESCRIPTION.rst create mode 100644 web_theme_classic/readme/ROADMAP.rst create mode 100644 web_theme_classic/static/description/product_template_form_with_module.png create mode 100644 web_theme_classic/static/description/product_template_form_without_module.png create mode 100644 web_theme_classic/static/src/scss/web_theme_classic.scss diff --git a/web_theme_classic/README.rst b/web_theme_classic/README.rst new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_theme_classic/__init__.py b/web_theme_classic/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_theme_classic/__manifest__.py b/web_theme_classic/__manifest__.py new file mode 100644 index 000000000000..afbab3753583 --- /dev/null +++ b/web_theme_classic/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright (C) 2022 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Web Theme Classic", + "summary": "Contrasted style on fields to improve the UI.", + "version": "16.0.1.0.1", + "author": "GRAP, Odoo Community Association (OCA)", + "maintainers": ["legalsylvain"], + "website": "https://github.com/OCA/web", + "license": "AGPL-3", + "category": "Extra Tools", + "depends": [ + "web", + ], + "assets": { + "web.assets_backend": [ + "/web_theme_classic/static/src/scss/web_theme_classic.scss", + ], + }, + "installable": True, + "application": True, +} diff --git a/web_theme_classic/readme/CONTRIBUTORS.rst b/web_theme_classic/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000000..e1525ce042bd --- /dev/null +++ b/web_theme_classic/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Sylvain LE GAL (https://www.twitter.com/legalsylvain) diff --git a/web_theme_classic/readme/DESCRIPTION.rst b/web_theme_classic/readme/DESCRIPTION.rst new file mode 100644 index 000000000000..8feb55858b87 --- /dev/null +++ b/web_theme_classic/readme/DESCRIPTION.rst @@ -0,0 +1,21 @@ +This module extend the Odoo Community Edition ``web`` module to improve visibility +of form view. + +**Rational:** +In Odoo V16, the design is very pure. That's great, but it generates some problem for +users : + +* buttons and fields are not identifiable. (we can not know exactly where there are + until you hover over them with the cursor) + +* there is no indication for the required fields until trying to save (or exit the screen) + +In a way, this module restores the form display of version 15, but preserving the "save on the fly" new feature. + +**Without this module** + +.. figure:: ../static/description/product_template_form_without_module.png + +**With this module** + +.. figure:: ../static/description/product_template_form_with_module.png diff --git a/web_theme_classic/readme/ROADMAP.rst b/web_theme_classic/readme/ROADMAP.rst new file mode 100644 index 000000000000..3a8e1bdc8abe --- /dev/null +++ b/web_theme_classic/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +* For the time being, the module improves form and search view. Some other improvement could + be done on other part of the UI. diff --git a/web_theme_classic/static/description/product_template_form_with_module.png b/web_theme_classic/static/description/product_template_form_with_module.png new file mode 100644 index 0000000000000000000000000000000000000000..c8849883ad89956979ce98ff0bccc01b7b938b24 GIT binary patch literal 58115 zcmd42byQXD*Dkyf1(gzzE)@Y4>28&7M7kT1?q;hr0-Nqo0YMrz-QC^YU7POsZXSJp z@B5u`-f_;KXN_TOSZl9)%{A{iuX)XD`pe0PVmu^%2!TK_#KnZeH8E$ zwWK*#@XrG)F;!a#1heV(4^kv8CJ6-c1R^f3J@YueFC!EmB=&ysmP_HgFO51QwP zGjB69`~sdij8<&yOdQ$UkIvv}x;A14+w>rI-;EUqVCfzPtZ? z4q>aQp}dl?%Dc*MOs$)A!Q0$n#vYIT_xSB=FNyl(*`FgPTKeA)tJ*RiNK{mYF`1ca z+!0EREjo40YhIOEd)b>3QZkgUpMNL%88)KRla0}2F8PchJtIw!%b2$+@Q`FG)LQv4 z11{^2e0z(~+L(mPJFi~7da!%Y(4zBk-AWDPgCd?P*I7)r5$}|S8aJs4)k@dIn@{re zCw$yUvIw~Bt74_{apA5@Jq#mw>|VIb$VB>&hySb)$|NjIb?Q`3Yhr~%;)z7T;201f zsm}e_M3_C7ukNT6t2!eb1(Gx)l3VNkB3=)3Xgs~?iyt`Jw55v2vs2$9o1vp%%!a6S zNYK)sr`B61&9u1q>c6o5*8&*w3vYz}9K@-AE(KS!iv4*Q@H{4c_rf_D<8`MuG|jY1 z^U?%O3eUbpAJpmhT0Q4WNfSJiR3)lT;yS=Dwj=ywRDx7AYHK-7&F*LlI-|*76_SD) zFG_a&T6;(1-#}}lFw>eZxhw2m$dMD3r*FmooNsXIkXc*JI z5``%&)I%9Rh&NW|fF%H}^|`ECh(k8RaB?CvndJ%z)pva~alP>IZtdQsnVGry=_+n` zulSYd083k2mr=tSb`bxsj54ouZ8v0f5|Sk72KLtWc8|DO_jV$zrf#Igr*_ubHqqUL zDE4u5gq)m;Umi?3d}FqPFRA>1;DelsSGz$&{R}w)0j2p@WFjU5$Pe>(J;yjb63))| zXj4WDsMv!Org*zP=fMaxEA8~U{C;q9j+K6NyS0LGX2nEcaWUSF%i&8LEV32tli9{G zNfDKjfYDQU%qZV{MApxOBP-;ss&Q%^r%AT4g7>d?s;!3)-iWi=&ELEzt zP3Wp>=@S^(#8Kxd&E)EQwjL{#=O;j6on$K-W}A`Cng~BHZD~R3%W^eHf%$8dVhP= z&h4O*>osqDl$VD=@+}&vjk>QR)e#lRsS!gT$Zy&Sw5`{des`U@d!+P~vN@oBu&7Er z)vPo%ceKiHt*`%KLh#h>Xc}v2nT!vy$`&j2oH{K`Th2-8=<#EGYsQzw^$tD>>gn6o zR#ScN-`j2C8966Lg>`QBUbSU2DEC!DMM)D6A0H_I@1m*eC4dUdibQfKDi*j*i*Vb2 z6jgG-1n-H-Oimy>yGL5&#Le2q=6R8{6?}*-L)-Ehw_{P2j2LfMB}MOC>Djm57jFj> zaB#3}cja&rc}iAmcr0>{Jn-CXi{d^%O6x&&vmGQ9<->>SyvCuymvUJDCh+>^;33!%TXT7*se z2bM1pjk2*<)99qKp$hF?9Y(z~?ie+)7soWa$pl*S+E`PPH~iIcbo}A%P4f|~9kj1r zO7}MOjNsF>vdCUXL`H_kC3%mVtyoDAn|mVX7n|69IR5EK?|Mx-x>QN_XiI$dZK7(q z6OS*JQ6E(yhN}ZL+-;scICaU2HII9gM81(kC-*e)1Ul>9Pv1MkzlPp z!_I4?+7|?Kk?F>v(dunkh*?$B zi{KnoRYphLm%i})!jfl?fJvtR6|C~e&*vH z0kLSA?ac`3&NhRY2E#2`vD5*BhQY=le|^#ZEZ4`7-zMvq1s{nna53L&YD#~M*P$ol z2{_g@r?V#&@10vNoiPS+LBr);Lgn$!YGZHh{JAML6L1Ddn0zp!<-9y5O}hO1_g~V} zd7^`fgc0QLqZTnqd7F@7eEQDrC*~ZFh-PAwq4B*PYe&2{LzHEeU)R(~#WSx5u6TZ=7>Syz1K%wFJ2#hq8!Ex$uw%5h&zAZtP2bp9QfM_;gWrQS ziF~KHLs3~7uGh^yVm|TCL5BSJ*uksh!Ag(%FI|1cp;z(HBFJY4bHR=0&VfBL#tMiy zdy?@IzNG8~jfdX?tnIAkHfX8)(v3Oh#xC+dzI=d+rEh31e9>1T6~|f9!)Gd0eos=l z(Dp>D(8lH^Ep2N{i%(z3liV^pbaTOLsl&(k_GhLITer zN)xw(E0|f(^jrI*_0@QlVk5dx?0F|=m!SzQ4fzI`K(}uH0A57Ii1bK85H3iPGQpUf ztk!GAiHUSQ!I+ODBfyJppI>5~@F|*EdaL{P<+l|J{ncZGfQOw{_KweZnfxiPJ?{ArHU5CBLSGk_dlz`t|tz6tcEuE92LGvkUbUGMD9tJm6|>YyO|3eWB6 zKIce(q|PIlXv@0fG7ZY z*in#?FOC~@^qf+NYP5dC?VEZ%rrHrQDREf>lY5 zTN+(8tc;PJp1H7mmzB-zHVVdnJS0vGIlVZ8al<#sNoC~~A&y1gdt4bnDktzg43w(5bikin z{8ZEFu+ z7=H)%xmX`_@?q zNbBt8U&}uY7+!7`q|2y#G;b7ZSg)6HPj(xzP^G0+T}`0zUN*5Dk&d$-QDIEnJxf03 zaS_bU$$5ZzNVzN~BEA28UuFLZCq#X6ctX4QVswTzL6Z9L z?)R#yuu|>QSnpbMqq>m$cfRtqx6|v)PX*mA-dhPxPoG=TV7dFVEF;i&=R8Ba03R=E zZ;>Nwch7cl&p3TyVME1|3yXnLpJCH|pdgKOD!Bz9f+?p~DrxSUk?p;^=NI#C(U9SFPHs^E#Hj;aD@i-wIZegoW)^7KvsHjHX5C zDFn^~JCMrCiOcsU1ZYq-;TDtv*W54+b-h?dm%GBvRHPCTMshd&8qg!W^eQai<~H-4 z0EF1v1uom?kxv)!v2QVFnsUm>1V=W+=)m<~AI%|J6J}QzS5`U>dU;KLp9pC-R`$^`|C||%%Fz%MH+d<`yD$50vShySfqwaN z&&Aml%o}}cv{l}si;6Os@AJ!rNmY1zdv|kdr3tQGDRn5ereEONyM2?DXb5LQgp|am zSAr-Q8SvhJOez9 z%fH?_IT39(4XOlroQ&iK8XuQtovjR}Re{1p>-^*-B1*~XsOU#j%hhjCLlHR2Qc|`a z<(t7vOAQwkuaL%yEEpix>bOktx`$p`#T)ikX6FHSKz@;Xud6q;>`p92%-Yo7PR_$a za=az=jP{_52A3-$;+=&Sf3?h73zU14!}8vD%RB+Z@aG!7-q%tyT z%B5{C;V58Vq^ADrr_9WvGJ(u(FSpNmxO1w>iM?BxXQ?3PP$qzsw6uIs((({#9Wie0 z;ZsmjVm4|DVUZw)xN*2*_ExheM$fpxWNXipJblB~27Xtk(Lx0m9JcEXm~VGOu@Bav zU%+>1t0w^E{3kCnVGNlVfZ1?qR-zUP*A(#U{NK$FZVgz9wz(T)nx`DCEF?} zE;gL~;%TtDl=!~uAJ2X85M5^<4|k967-G=)i!LG}YUHxYnU;!*P2gk=zx}kpo+6)4 zqk@!{miGL3NBq4tlPBzmRi&!PsK>MD5dG_&%S~zG1Q{bEe8|(*nnhxCl&^QL#CzMa zOE33k!o7usjoot5rUQoi4|n>>QuexPOgV(@?d=njP`X1|Id`1)>&Acol6K^EmQ&Pp zkE85OJ{@axIx8EBXN9!&((2yqur{Q8jkOtka*nm`H*RLsa?#0E#*o;VyDpjT_XLmu zbvtE`A#TW1M7FAqxz)~$B_$|E9yLA-Kba*HufOa}In2JWsI+`+k<_ylEUCLfV0!<- z(MrefD{;y0#VnXo(y%=nHydsx*N+v5IwD8LMZTnmS|(~;52VW5@-aKygC z_-<*=nP7y+bAr!X*>Nq-I#vgUcVMGrj|a+Vu4$MFvty4-B~OnB(|8a1qU{iaNlekl zKi$*oM96CGFA9bqSFl;cd<9Q1II?}4vsxzy3#&ndB}_~l%QqyU^u@gUgfeRd%Sh+V z)d9r7Xqff%EArLm78-X69VJV=4A}(REB4P0Kg$r8m|n(qPde=GPa+Q5kR2B{cwBTV_S$6yVvigOd0c3=GECKhsFL6PnB&1pp0zg^G)%+A(cCDP4qSuD&@2a*p1J zWrG>J?Flm0=tQYq^DB!u2eKKhr03)kKL-pl*_5Vxa#z0Sp1mZOKO-YSiH}Hlr}9xf zGc!|+FHAm;2fugN5nLz6jeGjAM+Eh!%k>#gnVv4G#g2^B#UvvD z3yg|Ndk2o2ZQb+@gOw)Ln8b;koc!q5{uXF4UtQxYK#5l!_8sO$o@?gGWeHb5_a3hV&x>8 zwTAVDj~#49Xr}6>ir!C=FK~!)x?r{|1psCbjZ{f%IBOae_jvNJcXVb~Eis@Xo zU0%`BmhZ&1A8uV61H$WDR3SIF&ls6?AcgG%hFYe?8{V6T$QLJRMMZ)2$QPYn94Hqe`71y98VWF?f>PY;#s_iw_63Vailm!lW_C8uIs5Vyb9h&m%w#<*_K3)AS@TxD z%=FH->>iYEevU)zJGX9(6ILfHN;-tafA9*DmL?ffP#v~%Kcgb;W|;4_yw5FDWG(p`vPe&)MPsX^q9JuyA#FB=)49~yvgp3`61ow3=(4$g^xL0q zSxha_9Z&+T9Yco=R`xk(5HfANIlG1lpGPC?Ue?hDyE8P}`-2H*QB7Z}6Up%K@PaZy zNE@`lIKn99{Lq^0vAWE`o84riEkC&N8Y9-_Ihkku=h1>4vl%V&R;A`PuB<&PzDj$; z9*S>m{3B>{W*dAn!?}e6LIzH&aC*mIRlHNNZsSfZ!Ne`;+T8}j6By{^ebJvq=-FP~ zRu-6+3=BKvi%L;>8jV4Kq64q>XH`{#t|uxE9#MVOy>I0gmZd{n7ULakoIE_%)5FRO zbGxgJ4?((C5^c>lYyL#;zUv_&iC7t(T|F3&o?Xym9VigwadChx1gl#vM3*0&p28W{ z`}s0u7U~8YJ)@Id<6yO?0eLm?-mp@Rn+n8^8ZG<%Y?Wf4FIVR}vwo-|-OUpd8wt;` zUP&L(V8odc3fVq@Jv8b(zq?RMg*^_p=Cg(M@-glNBncgz!&g67SJR!9H+P*g$7x+n zS~rq4a=I~o8=t-8I`PZN`4aH(L(cgWUrs}6Cpr#IYG2t^Zf>V zYBIC6m0QfaUJ=X>8QIweu9x({4~8y^swyhtawZqYaY$Mtaa-qCH$9VK9O{luEN)`Z zcavU2uMmsd!Wa1^O)c9Ca`FLbp$U8H=8<5_UjXO7J;D5&oqjs*21=m)&k>?Xz`>W@wKi0=)H>=zQYt55qfe=q30qGIzt z8(Xaq4ZEJXxw&c1y(zv|U%3tl;C70vd=5rkv3^P-9v6c|8)fOZHbt7Fk8Wq<&`}q6w@BafDNg%`95Pq7U)T5aMVLIK z7NbRK32zApGI$ayMcGMJa^;Vuw;#oH!lUF^V>9XfQjzMKvRvV|uFNd_Dl)Jd-P3zz z@73h%LnAbHoHMSea3@O+o<3>w9F}y{W%rD)q&#z`LMNSx-O#5cQc_Z|X07!q9GJlR zc;(4ER>=Pa4{h<5cq|kpLBZT?8l}iHnCXr8U&DWAZ_nm%Typm=o4FHLLTgj~Y3D`Z zOCtsW_fntJF+rz`iUMO}=J8n3@~upy)ALbYGJAVly^f&9n6u@FNv@Y9&s=@xS9ZGk zFDs_`&N0`T5-3LYCuKJ|^AY!v-X1`E(S+LFxH2UxTJoi%8N7KPp4g9GUR=CRk(t;s;R5v;`MuD#FrKbJPie~%6eKc z`k>xeo8_vJ!EbE}i9r?%aD#jMhjaUTDY48Z&n#8U;l-2ov2uEjJ)(4UjOEOQ7ZyvK9BfVFYk+s4vh zF?p6tFOpkj_nHNI9TYvASw8Y}0mory-1l35`G^E^b){&5NvA_eD`F+BbSA}Jh-B-^~RC+Q+=B}i}Ml97Xc9sg7v(PhZTOTDFXE{wp z&B6N?@6d`SG^B?MQ0z=)h#_UJoCjlY<^9Pm>8fF*1SBkk_|mQ__Gj>gdnzRu@>14aSI1* zH0Y#HN($MR`lQ1(5)t8Ye~`$TPke*M#!1%rzBj6Bjyg+{j*U<5p2A1>Cb#U(Chb07 zxytWh?Jxb}5oIwj*rwU1Y;kA>>|^r*J6wPB?W+!HPOeGZk@{pm3#h|%egWI=Zf%|} zsCCC{dAz5s#XZKF=cSzQqEtmoGh zs;2A!0xU^aTfRH#+Us@Wj>{aG~O0!EJjzrZhBPci!B) zcYd&Y<;ZL~&+LHUdjmp&`Q%*|>#Y|PzQajPMr+?a6yl_W@@Ct7=n8K6B0W3mDqGY$ zSEgalkB^UIq^Lp1D>XCop)vub=lRh};U4rjgpj{X0F;EFf{0{eBH25%%VQ&`Z*K`C z4Tw(Xp&iNA2h}rZ^@3W2@CsY&vT`2lPCk3rSqM4_nXYQwo&mX*$d0SoyTom^ zXW?r9Y5}f%>{4e#d?s~_J320v6VwiQPv@g&{k3ZSZ}`tb46CYc3o$X%keCD!mA2oj zxEHjh!51m6ZhKB^!9+*w#|%nGnwFa~!y4Z+v$FhyCdDU1o={=jJ_C4)ufLk=x$+Tj zo&jKdxHVHIjxGG>H)>f2?5*|M;-JNJHf!4ZpN94`V`)CjKc@(#zLg-oy}93IGjN#q zIa~vqhM)jz>9e85_A3(k&o9f$Im1IEzX37^bj%f{6cr7Ym-OvMDyUPf}0_V0} zi)|v~-)`dNeYePta6k&bXS(HA%+=EJ<5Ig9tAW1JEbgfG2A8Qx_Qx;(OB*n-O+KwN3Z+Kc*yX1e zWmly&J_=Rp09?n2y5nb!GoeDmWd(`VSPUVT|NW|)908NeP<2bU)Wd4LX^PnMNh znXeSEU`$e;sYJ$-O<6u_KjK*Orm3Yov%;6HW({KhQ4_UIqJPY6+hQXT&{B5c7Xx60uWxfcC%iXOf3 zujU4Z1qcBBBRx3{K>dTo=^YTehe!Rq~LrdIe4#(Xm!Q$Gd=szr4QbOTCWtd_N996pC~r z;6g=Hl4fp>5lA|U{CTYV0a!21vrIa$qbzJLJMk?V`}>0($dJdXEGR~&7}1qE($x$B zs>B``@kJ7B6qjtDuS*)5IGOV@HOp@DvV&Mun6g^z^hgJ5|8ddO@nf$ayI5&*)afQl?8pQf+ZN;>MI3^4IIsXGD_^`>3m>K z5rLxOFj!UIhup#jA#rQ2i<49vPNwkVL}b(LJZ43JrN{R3em2-m*g8JMx-%ERW8*k8aXqW$Lem4I4-I6tPQ_&cND95*c|7({D)iD0bnlI!~r}EkJ@k z5?EfOoa1u5BQal43;pEGw|)E`onm@BVwIe=idLt2!8zV}vpIS1$k7;p^YszhY}H)p zzxMeZ$7Y>x>G)9gdeQc~(Tn=AP8Sv@A?42NlI_c~6`voM$AjFMJCgc+`S;O%1|40> zTqfj>n`oF8J%s^&FDN$e$*4DDhdT_*xLr-}?b)XkrGC}A;?8%|eO%2?03=8&mP)n;Lh+1iTy8xXyNZoZ3vD`b9TlRe4_8Y`$w+G8~TfLIG zMrq;6^C91m5`Kt+a_re5^nfcO#6p}D;7O7M_zxy-J4^%6PB>fe^d^;PllxcrrKSL< z#th627COGqXU;_-z|kVL)%}%=#9y^IODWIG$E)N-zpH8HbyDeBw%$~QwE&QmsA!$6 zO@2AbazwHk6`puUO58__g&qB>NY^;HEBfTznivI_eqA zq6ALyNYEq&=~N$Bsi5!mY}+XTs>gk3=)PK_HK+awM2UtZGDTK<#J z3*qpzpFaz46Z%0@W_H!P|H_BetO{@cY)+y7L00%br1$@3mj3};n5;w8km2J~15f`x z*uA=r4uG;a5!X2W$W$nQV**z~uDdf6H9mbu(-)k3e~dYRBVz&6LihJVduDC*oU$@a z@ZT-DdgrQ2o!g6>-meMijf&VCN#9$6BvcnbrgQ#h>8ZVb3Bml7Hr(Jd9of6;qRg*< zZvOvMO8%c8NzHv>Zi$WYUznnlQ-Cp*iHn-E=kv#P{1PN{a_DY<^w;?Z3f0UPz84#+ z{557z^vDo(2{6I!=cOqCFO7DvNXDynAfUWOCm;8IpnUvkJzq#jZRmR1#BFaz{?{~9 zU`CQTQbsPjzPb5uLuj!~4zqP%95e0hEeHzFYAvW-&MbUj>k@!`kX$iu9q#t8r>rcp z`#2zxtyUOrpLHA-uIZN*Pk9Rwr||d+9Xi@ z+QZ<#G47*&!{1S8J|i2iTEiF&t!2I^Yq|I`uTv+#rKcXBgajFqETs*$0NV*a@3oX= zKbIkUe8H!CwShSf8UMVE1Tr|$NZyQOblVeZ%~9Bmf_4_#ZUWP{%M#?D;TdcFe!e{PUKjZ9 z%K>ku&$vc3;GGJ{$x}_&jEoG>E{4M?nSY{RVb94q;zo^*V(M|`!3UJapo|Z9dV*}6;+eMk zM(q=MR`gDj*)OHM$Z*_PBNkHr7~!rCzFThs?|xzKV`~nS!apeJ%hyXBb|FMcMm~DV zH^K1Sy{l1zkVub+g`YNCWM)K+MYz#g!z8Arw3s`+bJfbLwu73DK+8l1d2lh{4C*on zFKC{Zm2oj|c78nG=DzdB$>0&kEK8wyL4tp{D^Zb;7HSUtKgEYl0e4tb&wiw-m4ky` z!&pBc7Lo@K@CYK2bc|0{mHAOc)w_%`vNIayGMehWm*QjLXY=XWn`X(}hRhtYl{?uR zT8zfDodhjNj30#vxa}TrW}T-VRjz*VZEx$kGZz${O!-qX9i@|8miUcyFC^s~vd5Pl zh}{-W-3SKinf(e%#R;b2=J{Q~Bx)FEbOP5^CAxRFbgu}V?EdCj>p9znm}Gm3zSAH- z?1AgxgUz{4ul8!Le43zTw8dSl{qMbX$45~oSa!w@OL2Go;?r3=ug7FAOB$tWJRm(H zuGbxlj(>t17Zx+T@U*p2R$gB1VO?CzQPtjnt$~5jen&ilwLE%RF`Qn%sjvQM$CiDB zH!UlJQMDv8Qc2I$G-LQt2%6wZfyhidGxNr*2Q>;TTO8j^tui?#()Av*Ou81o&XYv(aFFmQC~K??KS{JoCcs`qUY!zWw%y@Ft?;l8Lj8c?DC}|?yKP31F#dQas%pD z^5V_R75$MhK7fE4`c1LxTsjKyyGhj-Twzfn@82_BV3C^HRKNT!N<3w3XI(eGR`ie%OtA#J_oJ;%REqS`Up78_+#5Q{>ZN?j;ESdvH>z}Ta< z51`}k9E^})m&Q25!^5|dc|IfWj?WTWw%EB4;y?y%a*RaLCN^2v`I=kw~1=8br2?j1ty zw_^TsLMN9Yi)<2f6b%iHo{G)Q^%^luur2uZes^8zQnJ*lNGpjT35pK86Ti5_He20o zlwZtJWcOkq;I%fPXjf*nRHge15H&N3ErGBQC`ABk_g0RCK_nOkluikOMQ)H+w5G%d z>5>NL_bS4}B1}y#X~^4}CUg`L8|aWEev#nktMc~m_UGi@;g>j|XiO(=@U?VwJS6_8 zH8DZ_iHZ#ZdbVZjJJ`He8;{?;t3KPy`WU9hItE+1l6F&jgE7RMoc6x;OA}@X{0M95z`1g|6Y%Mm3>XHW6O| zk2~t7`2M}$KS=vk`MoapJ(q!Es{t_7nml1IU%yBboy~`5DbN!~Mk>C(=8Fm`(Ha{g z9;-Qf1gSx?xO><65zdD2)-S>zS^HjNPeCiG)DJNx%G;<96m7I zZKJ=vyj;L66^OvH1MmEr;lBI%DP?88e&^GgOPzc5=G9;hfTH@mxUs$bx?BeZ1JRJ6 zO5$`AbkA;`xC!`E7!I6}|Ced_e!=xyax>NBx&Uu$6;*ZY@e~YS+`<=hIduSStMia_ zt;A7L^+reS7+U>QivNefD34K5SKm7oyqQBd&IBh`lN~#-nTAhJPO{jHh1fc1f%G#v z!|P{iNp9EE^K?}-S&Pq4t1_trwxwv*^MkgHsi}T6qrKJ_5U7!U68nA_`Rw{cc>h$^5 zZKNUe9M1CAw~|M1e?)XNE?jp|6+`j$&Lf(7< zlXar1>tk2x+!LSQqgIXfqpZp?0}^JF>2)>_*Y>1UF_|F7XkdyOkS7@$woM~B(4$gw#oRXr- z3hY@`+mc@LL$N75xIKZ~kP7qqDO}W7AD<5G!G=VCKUK;2oLzUl#B&A zkesZt<)R6juA4)0IRE5WroE%R`DqSqqchN5=HdcE(SEQ8uz`?|C$DyBV178O>SsgY zxu9gs)uv^W1#GeThJRR(sV&xZpRGo<$LEZ zSC0}bYc7yFm9le->FQvGRHI5mB7Yf0$BL6`Tcsc~!~X?lb4)5dTf+Yu{gt|AR) z1nWOJw0+7MEv8h5si#L~%6d~;NW>0M6yZss<4XuWEv=+<_g6f2yO5o;$(*Rsk)X8- z4OLbD*p&-oAScd>bPA!S0{uJx>#Gu22QaHS^v9Y@6*m35@tLV^9%VWnRJ3HG6=&M21 zyO(!?K)QVl4Q}UGki6PMZMUjwXZ>^6=TzzPYHA(!qf$l__R0snqBpQc@pj+>x33>) zXlC;Ze#a-|mz1I6Oq}ig7;o7v+p`@(YSD-QPgF zL3%Q;^9%vKQ#j`fD)2>H*=P^hTV?%um+gGemJ9%duWAd)Gx+G8%XwYi-K`39R^9_E-$)Ax0_ zZOe-e3^?z{uC{mfwl+>DzEqZ803uwZ(~U|Bm4Z(gXQD8@e0D~+F`Zjy8XF&G6+=V& z_By#X{+DLwkSVpc9Afp%X4M@_9*oEp7qbm&yB3UZ%F2k}%P!j*upXNjdqgP5BHC%~ zd?tFf1}6eB))(jua9e^`Kt9kh*DUQ<*Lq(M#_+lW6#K`<#}^hCr?>XB0@WH{q2)aL z3-~2DV^lWn0a7H2ja3+iPtC+~#xEkOuBdmeS}9+vRH3K9ac^g%`YSC}jR>A;uQ-^#$QI_Wo#;<^W7 zvMStxuXNgt4-%@`=)5^hV3l9GT1nxt(Cs+0+9~@f>QT^ad3@4zN}2A)a#bBkeC#q@l(jrwLg?v5 zYR_8egVoY+vcV{`;GI3EQH@=c|5_*#bXc-;n1@n zFufPgXJq2>ho?zEeII%&v{y~Syl`^GCY+O%*a(GZj`r8j7a1z$YIRm%#J|o%R9xY= zXffZR5fvqOo72*AI+8XsH*-3yN42s!htC_En;SZxyZ)?$+^FSEdY9a*>+X)6;j0XH zdhvUP6BJ0Xyhr$;sAW_kSsSdR!J2aQHLML!5%h#-*G1n_{@T~rhAFDU5bW64QPThA-^w__P*4Y2c-B%0m^Kk6jtqZfD!CK~Tk=L!b^l zN9EF`nGF;NfZN~^)%2YR)Gmkkgr4y(;j5&4DJ3niaG*{ z5g=vw=IM!SkxLKo0LM8mFkMv3ia$^xib=@m4n&a9O@d(C*4ddZn@0{p+wAF9r{&q{ zL0;LJ&t@E}(T&^Q;cf=B(zu&3{M;u#q3p`3yk*1{G`8tde6S4X!wdsS`Mta)qgeFT zbR^|JEyopKo(_@@u&~fg67#IjeDM1%F7wg3NY-JwL zln>rJ@<_rh_HjzC9Xvlj-R-^DSxDls&^>0T-9xNu8J%x3ge4|=R#&^{^cv}W79fgM zwcmL0@?~04HoAaz@&UoA@b}^_`@UCyXf}cru(JkhEfEJETBxYLD7D#8o=s7(=@<#o z-A>2R$*)^yk@Ab-IpTK{S{wx~g)A)SDQZvfMT{veYYsd-4KYvztAlP@cJ~i;4o1ef zC*9qv*8AuK9cMD2;+;$>B8)CeR$vOE8;p#KwjOWae~A839({GKP?ej>3ky-(wHdN>e7+B(3BIX9DoNb>apUGJ~kkd zc{D+N_j7(=wADZhXJc1C=$UQ<((Ga{m^>J0k0 z=*hoYfNy7WiKF=?>{h)3z<-k60bLIFb{Fs zI`wZEnVCO@zpdDr&0?l~XC|EDL7qZ>EosgHdYCx7QCLG%JUrhPVSJxTbEk8qP0vXk zUO;ORNEMEo?^c7!J`;NrF$tygYxbazOwe@^1_?hny~+=ll~E@j`f4?{P1v7iEBdql z#qZz0FNP7emNC1N2d3tg7sv78Gs(P%&t=Hts=Rck##4wKkJnPoq1XCXZxiA?POb3- za@3?@9nZ{3wB_euk zF)raOe2;5!x~_Svqd1?}xj3310M8$M!do=U*>hZZ4-F~gmVdf)=3Kmq zm0&wUbb0UtYQ3(ATm93=IGEcIHY@nngB*IZNymG&Wh>=s$?cJx+{sWKQcpwLI=fTm zeZzaf8$RoV)@f{g_#H{A>inUHT5+5xIW(Yf-zJXLq+vV-DtMBs>EKp?JhYx3w3O#~ z<4MaTEnR$+Yc5fKm= z@Ac!!fN$+xU5Ct{nrfuIDf>kjUhEz?1p1$-nFca}Y1YAl?Jwb9pWoWsy*JZ7erc9c zuX3r^Zw&j4<(Y%QaE0{arIqgy`x|vH(!w@KSw*@%6Z6CNSD#zrg8k>Z`%gXSj?=jI_(}fTIg8)Hyqb{I3lQ+_Of^KW#lFee}n+V>JI|mSg0chc+ax_iI0qe3Kw{y?^mqHS@pQ zuce-!nlQUz6)q+zX}a};^+gWGO_eRPsj}q{6AOF-DME=+Pj!yt{J$n&_)J5DdJz&! z(eqPz*2AsZshxp8dXdvrM+l>}@Nu*T-&fS+ngAoZIA-XMV-Vl-fBisgPA6U3+4Pm~ z@w#Zbg|Ahct}lzzsn|8*8ucXu!>s{1K#to+RbU>0b7Q?-;+2h_N){%(~(f@tFVeRtXi3;zv-YP2M zMa!0Xm6%WFJMGDnUz~(@Y3GM1YrE7G_^uX^`8G7r5$ZdXAuu?uV~@=z2P#i=F&GQU zY)QLmZ{oYVp(LVO9uE3gqJRDCZkTm`rw;~MLz!*w{7mg^^RBL-%IWemc8iH7UyAOP zLzdRQ^w}pBCtKTmd)nvS%soVo{MF~j`eS~BPWm0{Gv$FyyvGO{uH&Ysq$8yQSp0_{ z2a0`Qq|N24nse0xCsk;K{5BCMHQCvLo7Yab;L;Re;wkIV+3H?$k3**0her}6S4UKX z4uaJ%f<|6L-tnl9K+7c-Nt8?!mQ+o|Yj)SN_8{rx|0C=z!{X?cu3_9I!JXg`Ah^3* z2o^NB1PH-`y9M_^aCdiS&|tyc861KQK?mn+?sM+vy#K!I3V#CA)4g}?s#U92RWB`` z5pw=X***Z*^TEdm#)MM(L^}|; zeeo29eRC2__;>KA%0m3v7i?J^Mb^{xe8mo3yKnZ4?YbZDQYXgv_Dk8X>f&NNQ_%5B zQ`-TW=|{)I8hvE{kU(gDWBLTQ+-N&O-uxU4!05A$U$H+@Q-4=BKZHL#c-!600NsL# zaDOL|DYgzQpGG{)CU)yk3At{s_}u@*4}LMIuAm)C)ZVMH9m)Fi^sljQCC3+{wU@NC zq-d6FUF>Qbaa^6aS+BL>pR6=rh>F=Ty3Ub*x8K}cA}lj6#K?J6A$* z{y|>O`xzYh2jEI{%NXL34P2FtRi}YT+G5m&hpwX=*V}J*(9^-^EU$ognh>Y4Ic?Y) z^8-$>2UNtaZL_W5XqRtf^O>USYca&=za}pIE3UieU7ADxDQH2Y&22mTxdl0ULVLfH zl=mw_j?(@In43pm05wc3yBxtR>g&j_@Y>c?wBd>+midv{EL0)pcs1L#dt>uN6NyG~ zm57=lTPT7Uo(CY{$f9-p0zEiPkGcrPl3?GMy76_pgj zW%EIg<6fY9uro}<{1v$VzaB2kClUe6bt>ELfu;lNL?M!Z_0MANqbt;QrU)NK?BOqs zh^O;lldV>@uGIbqyEnPYNAoPYZHe-%nUsLkg;4rF1enE$ zPOoGUh^a7=fe*aecK6b6zK*XJdCxr6`kLck-*at^!@nr=7{i~@>En4i+u23T6Cw9}WnXpc zx4>n0yfm6B6wCUl>3pGU6|MWmai4QDLZ$W3j}iW>#Mj;zV|4}F$e3i^G|!$HE2k}y zLD-@xW9jG}FjCpz(5ZYcK8W9jiK3#SH5f!ZKr|3bs&u4P>3$EG=6V%te?Q#=WO$@m zNNr+#c&kdtZvV$f)!!!K6C_y4P4?hVO{!|TwMy$6ffl+^0yf-ioeyZ0pPKXJppZoE zL?@kU!*&AWABw>Or4_E7LV-C&Iixam-xj?b9Thm#K>*iJUs7@`N#6gT@~ zjLgj25Qu;kG!Mt2^nrpgsyQ=GAZ`S(CRk`G#4>x8zF`fnl1#WR`KHYvR-9E|j z#bHzrW*0c^f7sdMUE4j~OcGlk`mXeDFF#gnbAIJ?W9eCBqDVR2?N<2T4I#-wlglfr zMK+02@O-?;&inE0B|?VL;Qi+h!UpQUtkLV?@9`kINk(sKZi7r8tt=GzRpFn?g0s_{x6SGzY z4G~L!ij^6*%*)v`&CdCVCLjP5x~TgbgKt{<5X1-~Ut@(1P1wtFlRPdJbbWr6+iC1C zVPnATBmvtOd8@#_xgZ6Hd|!Lo`AH6lbOGXSZwhNe|G|5;v0>_loe`&9e9lMnWwppO zeWLwDK^D5k7#I8FMF#g+-1b?q=az9laJto>Zg#|K#b}XnR&7PIvHcX^G6l@`X{n-Z z^Y`Vwb`}mZhAG6^k3atY_!GEqvz`rJb#*L>K%{?`kEiezigQ8TH^esp)cT^XxXF(N zWTX{$2Xale`aSV-ShPeH-^AozN6JnuQxQbM8n5ui%r7=6bCdNuex2sz9I~AXSPdj7 zx$$V6FRY~7E-Ml$2s~r6B836gDm4m8HxJO2+VI`OE7|mhKKu_$R%^% z@>b{#@9~VR(xK~_4FWe&Zw;;^e-cL%Mb~ROl1O;aTC62XQZdo(Ebv6*IbxO{3`BS&iL z8Z{iD2ynKl!~H77(re@fJ)?`&b;EY)o?s86c{w>+sv-NX9zE!tG=Nbb%a z4;?|ImL)CGN%RnrhMY(6a?kf{WK!BllhXv(C@&org6(`2(O*Qrkn2D5T|4|6pa}}2 zNQKxT-`8r%8}e&eg4K)k}M?sO=i+&9B+euN>jg<%w_+X zi{i`Noy00*Zf>rs)ex^L^Lna`_4_X>7M6y2#*to1dF4CQf}&P2ChMC=COZ)%fA_c^ zqUde@8*kB%!Z&Xuf;v<_2)q?!gn#b0<1_1anb6qkjVufP$CvbV_GNx$u7-z$ z?C29mIVKy~glc&NmHt-rI`ID+n8te8^o0v8!vwYT2SAQ>~i>my|xxjSA^KEk_ zoenWI0cL{cWX!{!t?EF_g1Y;D0}DD}q@@Q-K;Q6oz4wiG(kEt#o~BBfg2KWrC^D`4 zBn+)X4RXIJZ@pM5y!as2iEg7OCYRV-|Lou2c?9Az9q)zs!6Q{xQfTUsnbkF$An5^75$D_}Gk(l9YFL zcWb}g!l5mAOY!6N)_M1ta**Y(iGSZVMpRcA8>XS*LhrILxqV=?*n~27>OR5K$Yn~+ z6qPPEu>uD5KI!eT#0BBIJWyVstL=(IkH>yoT3T=Oh<1(1cF_Pu8o#*a$3(}2LI%fP z)G?2{gD#%`Zg!t&FHul9GIo?>5CV7_@dODiv9u~EE{yCWqI%A1AvVMpEoj9= z!iF6Cy}#|Cyuz7=p`ipV4jmqrnz~-h1lp^ZMV(HVTzQNjnS`R&MUsYmCU8UA6?1aU z-F-ic?q3e(r19-g3v?7@X4Rw#@=yfKYe7`9W2z=wuKSq@7@}{}XXc;H9d`VmV7zap z7@`HZYmtGt7Pt9p#p(PvxlZRp`2fW@mJBu3-o$g*)>dV-2;M&iQ5!2?aLw#CaQcqR zfea7w4L(>SQ(?n`rVk!jul+Q-6pOuu3IW>4c}5w`OTy3@1-K1QR`SNFzC4a&ohVg) zX+}J1GPKvIp(t7(aUus$v=AN1NaaYm37!(U6Y;yx3*)k~6ciO<%o-3dNy1n(7o`Zi zZ}BZGb{lMG(kRy2;2c(KM8$WZ+DpT*iiLsB`ZNLiZq>Ad0CqVCbB zT}G0+x*Wb;*+t6ef0i2w;gK@>{%-D1<^?;m{F8w%k}EQOm22PhPpf=gYB#4-?-Y>i z1H%)DIwuh-jU;)sKRjZps@L96NY0QIu<;qk>g1h;JPRO)4LY%6u>kG9jxoz8NB(5P zl8rrBTWhBFRmgvyXGJlhLm3Xa9gr7Bk=5s)~YJ=o|FtdfZo-5g;{sMn0*_%5jl{QC+9#UP>sGxZYO9IuzO zzx~3*K8EsO%vT%r&uM4(s)(_wEK@|vpa##^S_q*y0-$eBqz+#*}4%!?Wv#f!4V5 z1_linlOmI^7bPOfnl-rAV{R?Il5Ounmb090msJ-YB-&ga;kZ6VMU2{u~xNJEI2~k#T!7vH< zm_-|0szFEh+g-VYrjEb8QZLAm(9m7PcEweKsb7KNv8boY3%ZstG-iuLq^Q)arqhz8 zBI=P|-IW!|5u$DAfiYNnJ7Sb&Rl{*&U8}>wWHkx$u#t@+lUr%Zgk5ZNp;1a2HG6u9 zCE_#(to=W$lE8tq-Ix6|X!F_%KBj6ML7s)Lq}99!lm4U1{F-T4c(gr0MZQzSa%4>HXi1jHlg7F=$GEHavQMNi6C1)Jk`N}~(9aUx*7OSJDY=%WfH>(s8gwK3NvkP69I z+E^eLzQN$+tozYq@a?y<_v4j*73kbNum{Z$u)cSlH?qqO2eTX7E4ZJ>(zXyW@1SA< zgA`t|v$G9)_qHod!8$C{lfQ6ZfXdC4Dw>>-p|QBlHY?3vPSp3`CdEBqVRsSXLEPWn z$>H-cAo=9GNC;cDWVk2f(Y%ZNhV0_44DV^FU~YVP5PD?; z_R+iP<5}!GK8q~U79XR2=SV*jhE9n3curAJBm}D;x zetOjx4xJ}{nKok&R+Yl}=b<#!2Xe@PSZwGhf&c6WnR(dBfo;L{a;r0XY@7Gkrh*Ad zmoZjlwCJ|VxS57$&Pt8b*%B9ah##_2ExYSdWa2}o%JPXrVQlF^-?qj5=b@%cG(HTR zUU1yc2!PJ!R|<-Y9sf|ZcMUwQ9dPOX-PH!d{y3!Xq@s?ciw$`aR7RaUncHPtE-%{ zKiRd0m1;c8d3w?td8_FjT^!69S-iMk?_27(Zxt0(CJHP@uANW8p|xh!dy`W43m)Lt zG=lTXyq`yRS3QrqU~i7=p{<8yuVIAGhqz=8^BPfWe6 z1qKPXdFcL4Ayi*ebF-t0&8mjW)q>2(_ZHP@4>U1dc%j?jiD+T50-!+;57s}cx33`W zr}*E#mBD+)Z2uh>Vq>>mrcGiqlIGW!@%2TI;ossP7kk#j5_P|a?Y}zmGo3EDPZe?# zOy{en;o-@QA@^bj>R1^**FRmrP;4<4v-t`pZ|K@Wg+cp|-rg%fY@C-!&DTuqb4S)M zu&*!Ey#9~wBtFCpGi@nN&>0Q+jEb?DN@n&w@=>&kK_4z6> zH8}pL!+0-Dy@81FWmZhy9Geyn&5%^~2Rur6Z`fN3cGa^2*qc+7 zACcTpC9fKz)FH*gYbrL)9|CPxFfR;H#eukEzVlnE)>{-9bn>0hFl%&?BVV9GdxD%& zCx|1Y^b|ChF|m(}awFh(EO7Y;?7|kk$m3Dh4p}?Jb^ve?qVeS)RPVF?PynZbJ@!2Y zVmjKu+d(~ORb5YC_eMR$ti2r1v?3y#>%4EZGd%X_6tc%sI8r~^cZ8{yytTeR-!-ZQ zegnFkrV+l`NWVPsy3A_nr}ev=aR)9JTwsfjZ}IUX3ouSM+2P@=c%GDh5%=@BH&BFb zjVmkL@gE4mEMKZI;VCV(_TqMU3Hhg263BCg@9JrQPwKm^>5iuJaarFdv67~8m~nD_ ze!tf+^KRpMC7b>g%B)9>h~osSUc;GT*TZ?2Yq{aCswf&9)Qgq%d66Y>odx{QpBCm8 zJZDY#g!UF&ee1LqvM^tl8&~l_a{x z{I_rtOX?tS*lwU*mT}1oEC(&Xr(!I#TARn62nebyfpeKE`lwmec37?N*l+aZgzF_> z`#?3po-z)R%2m4cKX`1k)Kw?d|6$AfU}c$tUCFvL>uf63WCuy<7^}zqspBnF4c2qo z+)Y8!CS!ttTSSd=M1OlIogC~g0za}rp3bjg>VY6@^3jDikaW=@2rc5!4m;dYVL;+n zJU}i9di+tic@+IT`Va;P6UbL;1wbmNnSxq2W2E*SV-LZRK#5A<9jw#lastvGBn|(b z%4>_WQI()l;DJryjnvwTn3#xnwrryU?8~IyMX1%DDc>{cnKzoPfvXOfL3Zgr6URV9YJ~Hiu|J zA=77iHuN7JFwqG{k#fAC;0)h88E%{T2$v(@ovVdx(_bN)0768~o){!|6V^B)^E%85 z1y| z0~Ob<2)M1ppZHuB!+tjaNV|cwSGPW1D|y^(HXn8jmRH>|+b%m(^YBEgG7i;Qpr>-~ ziUH@5!t0p#B@olZ@Q<(fjU+{{dYw{E>S?Gtyuzhl9qmD;j8TsOToQ}^4F>>q8#LCd zU#Jpak+LHKT0p|7fy z+v}c3x@=bLUl)mK8F|(grlaFcM>+ro}R#H(JPZ_54q^JI4Y^}ox7t6dOWmm zgXGB<$MxB>UY!P4OO~gwcCP&zDn9aBS~1Y2*K%Yd#FqM?we5D-6PcrVa@V8fm~Dsq zljMO@kpzaU6p3t6Il2=ryVX;-qg7_@cXT{FFR@(RDT_Qo@NyiPl$Wn`F=EF3S! zViQtRJCyc)9gxS#e$LFG&+gC z*NIrmpFAMTeWezvLgxiy(BHN2mdfvys1bhaMa^%?12nn+Y5^Y3P5jeK z)wmpLjC+gEhsVVx~e;DC7j*-fQ#<2atjZD zgC6(^zslK?d4=PG8pV0$8YxyC^lAcwT~Kt>jSGEs6n+p>oDq?J3W+mo&3J2sG|W=AYF2T(fvp;^)Mo}DJ->%ka41Qg0Aok~y&76KC z0S_$N6TJ9L(Jh(BPEEnY2LTHZ^e&n&tLowgfDc1LPccGSOLmhmtHU?xyp@O>Taor< zTtpnse{?fE4{u=%Eki{L+m?NQ$x&ENWF4}Srm%1B>ESLIZ9QDXZXMU(f4g4tY5m)4 zmcoCAVd!(^_yTB@l=i3O*1?s|7k#IE3=GLDc3x##k-ws%SO6sX1G*y;zZO?he0n>r z^xT&p+j+wJ2_?8Jg>#p9Tm*{puI&&1=ZP%6eMhg0c4YT6ndTO&SPGw(zr9B`KE6X# zKpn1T#nx;*1DcS8=zX(^hlaiY@9=o_{2q;jR^R8!0DPn(=3|*W;JOnpC9o4m1JnFj zN;y0yKq>F+1&Ed;S^d(v{0PwtJZNp=Y1~b2Dv29a3Q@ff{qouE*mlz)jMR=l z`JX6x*mT9jvbxbIMh2uFb@l19tw!yx2B6}_i~R{|f=G|-lV~qdNQ;I$bd9nVIBP`g z8?@Db$Ma;ezm4$}J1tpAF}(w)Igf%LAbj?QgNJj>F#HdH&6a?$9vpmR^GJKB^j%V7 zzWVvMkS|ymdis6+v{)%w>PVQEhGqnPxkA6yIe9QeheYjTgTTS*nMo+-d7vl|^))N+ z{wZ(rv(r6|{h1eJ=Z}%fBMsz5T5$x?p$+>tkyoqcu4t*5sToj8Fw_x%j$u|u5m$eA z@*)j3aV*c0NvrQ8*>0_oIkbz$mHd1~Sv^13gWAlRU-mA8@mf%~>@WJ)rNa+~ddJQi z-9FPT9t>P~zNOYP^d5eWz$){7+wl;7x;a4z!hZq1Q6!oo2YQW%LZ>dxc0z^`ur;5@ zpfKFlKbqGheMCGzY6H^>hOfU*>Is=u2-%Q2Mdo9}^EJjn9`43A>z_iZx z^4>;(qGT#h=19a7;&Jg7)EzyaHa%_ob)_j4U<|ff_aT-i%arbad(r`Q*H+sRWTn)J z-d7uDtsS}q=@jw2wCD+30#+1=c^j`Z=z%;`JyOaWjZu712N>NU;4kEEo|k%gC(tnZ0Ujcm%1 z%nk0;ibW~6;Tywq%)t4rnil9D4vl4Gjc*ERYNJtW_KXFVWu)9=1Cc>hCy9EGAE1s! zv)RD4xowlV>I83nD=c*Rmva(#S*0AHT;Qi=fBbT3Vp6*JAS5bcLXzxL~` zv{W~2`37p-4>%3ocX{S3*W;W=C6HTTLqgEV01nFu#@u4pc!h(2CB@*VcyC9v)=$#H zA{FXsS%=x3*+5&>Dw3MI1g7oWbMa*Ypa$SLeqr(n%L5t5*OeDqr}ca|ftaT(R2$yJ zUVe3O+*iAOq>knMJZ-AchHYG6U(wLRB0gE*ycZq2&T%^}Q&45g4N>UHXYK*CcUn#b zX;n`DuJ6w8+P=civo9@9eOW%K)1Zql<4btObm|`rtMyWDJsS^NT z(3oAGg}{+eLO%RIyJ2lJ#Y-kPljp$&2Me{)uRTWwXP;34EC`(O*$;dEhW#E4%5ONV zX?)u`dv+T+HL!5VMt&j-Uekc4cDyhd((>)@;kKR;a5^Hjl>(^DZ`I4fqxdDF%90LgS0?w}?zyzAwCSw#i0 zdC8Lx&yI-OpULQU$Q>o2finvXrOze(_TaNgb!`6LdXU)jtr`$c+}d5d?d)JF{Xj0r zUZ>=PWL$w}F~mKAi1q*Ek~iDdKzonFy3Ycq-xCXkhq+#Ul+w%2MN2USZ}$N&ZlM)n z4vso5y3v?kD@;K8c9GWZg4NKoe_`?y8P&XC<~Tbe0)^UTH+9i)f7mee4%3ZtoUifFUuzj zlawz$c_lF)3G)pPU9f!;>wW+bsn1F6bED}+Sfk5S!_Fg4RAzlkfz--3Id)3#0@BXr ze)_2yveRMM^)%RqRZ4fZ19VrXYrm>`$E@XTu$^M3kWH6mmz+dEcLiG43=l^v&iF>b z*3sa9f9kh(#Q(S2Z!L}c_4R$Zjo6}V#k_~B*4BN5EX~)YIul@xbp-@k!AC!StjihTWEU4(0&L)wx_?OL{x58?ki^7~-IXGfuePn$+S=j{&Uf1lhqxTQ6%^E_ zQ%I$rpBVm5O4*+eGe^F#4KSilH?{znoGRIV@mtcr)D>SxOIv~S=+>}K-$C z$Mjr^ax@v1odv%)Wnvc^BugDkp0M}QlmGlN))R`EcSQBbe^VoI$^Z3@f!B4h_Im!G z$wtD?D1Fasfiy@cW`S2VEZOS5)pEnBNDi}sa-bJ@F^EoS)YVV)#<&Cez3Fpzu5x+|SUn_G)YB$Zr4SYgi)^dI z_o&kHXzg^2@A;@h^sr%)#G zx`c7x#~7%gO8WJx>-Flz7lIBYXWENbAo8QHJDTVb{!0&G`+4woO9Kf^glve!=uHnk#-Gsqr>@<3<5;v!Y%}zFmGitc0wrfxo#7j@yk34wv!pXZLF#??$z!rzg{a4eV0cX^C}(aAY%s^Bt zoI`dJ_}fUZn9ZryN*q;whw(4JrwccLmXoOT`8?*C08oX<;_IDqGxe5T1rx}aWmuvQ z_v>!PE5B`;+_cBEf_RJ==qJK!PpUS5O`K&th+WMZu;{RRHBU6wM{$78hs_LqB94#g z6%zi;&K_>Lg}VmxL{o~rc0fO0^Vr{2utn&x4Rya5BXpMt?R!G?I?nxXk z6h4;(_E9{ad>|*MzN0B4uq7poYo%StfI`Oc-O`es!{I^k^FVJf<>^%I$-9yBxm&%L z9qsZ}WNL7&VTq(~MJy<=FjY0a{cSgmm(Av1_plg4P1DXqd|-W}p%LE49nj$H9q_S1 zEr$gTsM0<#5eWt2%lGVKzjDIRfi3G*o93!V4aqmRygB=n(@2dIZXA`Hmxr^`gc{u2 zM;5Be2vpSIFn&rjhe&c0&;UZfCR^%F_FPqz6-U+K2sd-9WBZHlH#}Ib8h{iyK-@n+ zmTU-hkX%{T^KtHXI`{9*3NBg4hgvx*hfY&r5{6YZ0Wu+Egw}!BfzM@Bq>D^mOahJj0jh-I`xWQ_ZJS z-dA&Eoi|%j12HFqOvM@dg+s|d@h?uAjpjWlvBkW(Mv~dKO7cUda;4m+XShl$SS*+7 z5Z|Xci*05OMuUS^*`;rf8i}2wkg?8{|b!`4ed<$ z`6i~@3C60HM4$qqFZaKx7-ak@MamaUtZM@U(dA2RE@sm+;7ksi`E;<}ZCRP(Tjmj+ z_G@I($IG<>2nvu}cP&`IajYIoZ#D&(l2L%8d}n}VF%&li<_vxT&p=?QvzjUfLBS&x zhL0ka8IBylotZw~Wv2+=u2&e`!^7mu8l>ROF3mt6)}O&6qp9|jO}3W64abjXVp9pV zGwIpz+UbwUQFiP$zI_j5k%8z{HgTsE8@=e&`!9)qC}q;i{bl%iV#`Jm$?cDa#{Kvq z3-Aj7@vs}o_W69-MhQd^23f3YIU5LV*-b(Zm+pO^!k&VwBAf}({nTPzh_yOVy}d3h zdY4R(_t`^;g!=6x+vO9M*&Ty4v8$t~3>hDwkdEKuc8at(pRW$_Use_D8!mSGk~{LN zGLjAY5N-4Gx^hbbDi#hQSx-;Fc=;4neqa(vT#;*xkZv9oCaSyA33LIT)n&P zO3KhUy{HoSo&)ayLc7WytE;>d&q> z`Sm5seQR8A(CrjFnEny)0uGSYeHpv<6Vu*J)lAmoZ%*hf&rb^n(}k9q+pYJI{g%sV z+@%&rOdyba(9^3Ci6oqONp40{FMKnz?;m09x*iV-c%1VK&d*N-fEdg zH!317!p&>f=9vp%Txdn(HK)OR!=+WI?RouwQl{;x)!7o6{dNDJ73v z-kw*#XbC)_#A3eGK>4Cku9_JrbcXpDeB-dLq#uZDRhwLZSO%9)dN%I}qKC>^2*kAqecUO`_JbT0qfTM#Al6?~Z zV8P_{_U+6=wYcnNWVs*5`LSSHyfQdfyHrU@LqjekOp@UjlinMH%uLY4I4peL-)}aa zE)W1cKQV*uA(1RbPjvnLpHLCt8my+0vPAAZ?&)9B&`?TWmVc^SzIX2cJ_vXV)%8g` zz%UJ(90X(Yt`A)wuboFsGOXMd|-^nX0`vDkK8u#yF&2lW~BUhphFUnNs z)tfV1CPu5@&Fk;X0f!+?O{K0eV?9?U@_3io-Qw6)Y&J;ISj7i0mB1(W0pf9c#hws& z36>&ICo^cj-U4)^ z)YvbeC^&~Uzq7-=TUz{?(`>-J=))r=kf9WSK;J>2&zBG%JhK6PL*^M{mGycH-S?^I ztl55|K@*~0u@)l)H69m&fbF$1IV+zZEMKX{2z;gmoSeL?Yl7fJeR1b~8y+56pVP$H zZVjt{3B9WEud12*M=QQq$Gl zd%QgcTzqk+YtOq_8?O)iCV0TM-P|1sd|hox1H81i=!^f~nUq3y7$8obE#shmF*x{u z2seH%##L0%JV_&Ix%t@iM3jaP1#Z6n9+BKMAOccgK)q##q zwE+X_*J9Nt{5pyrgLLD$iQl*|arUFvgRJ=9l7;i$mA%s7YQu}ApL+nhCW_5glA`&0 zeP)u4d=(UjUq_2z07w9^b#?ALIyo|`XDysAEI{X22}tLpPG z!7v^D^l^%&Ab8kTH44k7$BtB$Zn;9q}*ZI9Hmtf-uy^pl^pbEvj%V|m=gcjO5zB^K_3r+ z%wtWSNro!6B4XJz3RDRE*6zE24_lxJQ-R?2AOxrD=HSV0BH?T~dD~*p8@7v+p3Dh4 z)T6J0;K{KK<4|~KG2RiW4!axRhgmX)b*TLB>f(yd+F>dK3Jqe;=mc%Sn2pV&;!JM0 zaN!on;Z5P;;u6B{If;RNzHd7b0uQMp!g=n(>CgvWVKdSq)2!MGW}$8(5jE7V2F5&L zsEX2V=a|U51LdBUXazX4( zR%(vw95Gy(;EY78kTJK_peq+9XeXer4dKfyZap5feujIs82w&fGKZ zij6smPSU3p@dd^Tt1V*G@MYxRF4zs9Y^dT9U$YJ7ypJwK8{Vi4dgb+x5>;1stoDR5 z;Qs`)lsNrO+6g~@0$nk$O(`vESSXV$T3s;l&Y0Si=DdGY^XQej!+t+hNhmsc8!wVm zZbK1QQf;-h->39S^^DQq)}~rZ!ZcOV^Z>!oIM?%55)@;0#fe%-Yd0zW5G?{zd*9|_ z(?9%^w6sJgfCESPAFG8?eH(my?A_*SJGUtH@~wYweE{LuVH*;U4Z$DxE7_RI^sMR;%hLV0DD*&v1+*5nWnmQAkjoLOhc0x-GL` z=vrYNa)7*70P6Q@*AMT%r$lIw2;~MIg6lQtz639Z{f72>j=u9jyz~%8GWu~lH=y8x zw#j`7ZWvQOXLSP}4Gxx4k%`43x3PV-XE8*cJ7PXfl{NyAf0+s=IyW)+g#WuF6X8Qi#AhsYI40`j!Zw{kVRQfz4tB*^ zb-MxS=y9xY8zrRPEQbGmu|H#B4NJDr?O+Ql;r10O48|}ziB(v$W)w1d$!lqOXL)%9 z!r6&Bf-NN+n6H>>D@ApAc)`@g)=u9pK5g-10YLQf(pk^#@V7+e@)op}95=CWOBW47 zL^epp%9=S>?z@v|ZC~R)yB<&n;-?G4;H!PGfu9LEWh_$g3 z-c2B=^ob2ec#-`7dhx;@{m%sPW<^jxcte^fN}d(k)zPviVuOS8^A}@e8PXX0J~6+| z=RnK2@v2dXb(|b{71LkiEgJZ97id{+fX~Dh`7w?R?c*n5 zASo<+8)inGwk6vB$(&>1!$0r=;J z7!^<>)gC|3cwtTcYcjbY^^b_gpP5;@p5z+mPa<{gRd_qQ5xHBo)N1}nW(os6kpJ}s9wXzdp(d)?+4N>3 zuca!P*jVXFtOF)EjlW9%+$|_7{&Dc4?55+PN!Q9$-(ErnG9;zfQS%7u0Cb&6Ekdl^ z8X;b#gZocAK$5ynQg67-Q$P!jMtqkE^4#^(T#i-56Gk_&qjKykOE{J(CMxYek#Y2$M7s zDi#;GiyoJjB=d$2ktNuXtT{#k^d|46bwRBxP$IDqw2b!3ct*vhw5+0=@Nd1xj4aED z98e(0_7jeD(2RT78yjM^lHkUn|1vn)1m7}(|4|VQ&5aBONHMc5OqhZv&U0DND=|fl zy#0dH6>_~9SB--fV5tosI9|W6eJ}ji^b0b+^#A)9=t0da5}O2=vjbz&leF|#kSakn z5PPS-#9%DYa0sZ36YH$jYJmX@4K#RYnhR16WMqQ_jt%Y3Ih=T>DH{ZG+*V|RW9&67 ze2W_{a;gzJwC`!j07?evBmfcu&uc+Ei(6H+I;T36P)P)4<}>661aIG{2_u_BJD9GC zPz&7~Z{I{X3tdKwToz^uZim=1EI6H(G2*Q?ny6hw4G8}_Whp*8Sr!=f0xKZ?E;jbcP z!esL8n1`}m{7Q7IsT?T)mLHIhm39_!7$*iR%&s=a^!}>_kc?tmQ9bjC=9uH5!cZVa z4zIvOCHo3!F9B@v0x(R);)XaK*8BM0meph6@L=G`AaC;^;v{$nQEgzqs`u{8v)hz- zVIz^lUdalPFcAEj!isSP`3KC~!BD^Uc32U(12H^{j)bnC4%Q{M>vtR)QsiYH*0W;EDT;Xoq{S6&k4{fB(uGq?fi=x3SKe`8K@hBbt zT4PIEnR$3d612T|Hq$ksy($^zE`i~e@toap z4~$McB;kKbU%Lbgv5HH^Q+WP-`{s>&GWA=uz&}BVs?x7yq{TnJI*?H<>+rucEPztT zGb+fRTDa{$n(-+~)=^o#`Rmy^5h~|;mQZW~x!prnJIBH@1$ z5~{GRaD-k;s^JeK9iiGxhGk^1aMnAukmCm@)T76I_+V~nL2Rk;Mn&5cS7|!JV zn;eo*$sOL&=x8T=8yi-)A~(j0W0NO~vM=KKQz;XvDq3h-uuJuP4&BZ%jW3p0u8 zM~yKA#109Ga>kN~9(`#}`>ozpC#g2l)dbpq55N{j4x>lJy~&r^{idJzqbd`aDQUBB z2SPecyZe{=XSrbUxJ!sgr(DY-a5s)9!wfAm45#?-B|Gy__ZS`rh~Cp7I)x$|d-rC4 zLI&EfzQ+~Y1(;^NRqHt7@$cbQlu+w7W}hf>FYbxupvs-HQpNnz2}Uo%j1I=-K_mH= z0PpsLthE|HN{aR4$BW5WkO+74A5t%V!4l# zX`kiT>0vMbyzhrm?kB(>n%~XQY$%cp`2ul=8M=@L^Gj1hxsf!WPr@Cq&hb8vu04G? zgV7L!yEuE_kE?0s)Y&cNclDvEH^pD|9E!zG`H7k-&qC1^yi}F+W7b~{fkoFACFY}XBm+ob`|Riv{vFgF}AAQ17JA4 z=y~q`{8Am0ED1C>zS3wZs)izjfceFdp2Ux;${qN#AQ8Ox(RZt~(va&`$FeVAJ$N^| zw`jH#``Jw#Zn8*o!qV_>plN_KPgU*xX#(ur>_xY+;(IGvdsSM6e`hZAnE}l`PFvk6 z+^Uo1NZV0xR^8lJIRnCYJvxNq)oN3L9(uCdR`AdX?5q-o+%fmi1Vh9gHHa^Q>%@A^dH;4gm@oLTMm5ILYi+f#3 zX==VD@#Fs8Ki-ytcFy=qOHeID+%6Vwcf1DPDW7OY)))e*R^ujOU$wSL7lJ3s9%e49 z{R~(3<(+5=hw^QSaRyfWswY~?XVH!Er#*g-WLDaBwB4%bG;8)865KaMf>>xp7dk9r z4yWHGIueZ?j|m$xaw<$NWgZW9KdKe;)Gj zKgl`_RTLG!lx7+M>gGJNh$xBTnS`{YBzxVzqLnyY&h-?zTf;U;Y}nYNERHOI&eZB@$XGFER}%N=0TTKt!0_ zNkZhlLK-?b2cC707`-8az8MBaPbTuGtc_p@5_2U%e?z4#2RXA_h&1AbhUbON`RF%e zMZFy?$072(xKHD6np1M~IQlIPH{*o9OO_K&luAhCt3e(NrigIyA_h`MRbiq7W%GG7 zHMl!?ZHpO6%;Kf{Ta+OJJP}AT<%ly^HmXtKI2zQ_jTyPG6SMu$Lrkk3w_Hi{73kKN?Xx#m z)F-|z#fBbw=;IW(?=;>3=-H$+({J|EDW}EqsP_mrNidO0ydxN4^a+*PKeloe7MH!qo<6h_t4QNaLb-WCQ0GGTKOWS(5T zu{WaLLSke2fVX7j$<))su;{l1uH9qBC8m6jP}Ery1o0lzMXEewQwa8E z`5;doTyd9ZC!0uR4^H*K`a2Q6D}|(1E_>yDZ`9_E7$i|>R87(F z6_B=!(?ED=Vl;z0$HVt^qb>wM$ax61> zTZqVHK~KKxI-5RdH1VKbK1`*%zdv=JHJ!^`)o){S9jdPv9TIaAt+FiCWIvLVY-n*m zE&?oes7XG!cdkEGMeGj7pJSULJ~5-0&*%fP@o>XLtHS~387eBjpkSR9gplYGsZ+Nl z(FgenDaU7p!DF|-2WB-Qq6pee_58{!@X9qUD=0k4{w+_|WIdaP0 zirn%1`n~jI*sT46$a_aK5Z;{j!QGNRxn)%lf`xL~36c|@QxLa)r|Yzo|IH1wZV6~T z46tw;#7KeiT!-bjcfh^x$8!pOMVQ1$1ywyEcyMlPx8Lc?7vuAT%2sy#ujYw`C%*Mb~e^q2-DZk!2bVn_m**0ZSA`-7KoHI zlABIJx6~+oagRH$J1*b9y+r89dOnxWz1hO@;e48`>DYylmq>+9 zE~V#ZPOp2dHeo7{ZC@jWpJD%TLQsz*LJco2f8-As=_WIZ^}{mZWw?XBfLlNoWdC(B zy;`WpX*J|z6BaFh%OdCodtV0OG(BMe!-=J& z&5`)_FzQ`ZVG~WLH#Tho&@Tb<+wsbRDAwy*F_k`K- z-qp#z?cMdyPRRyR->Hj^lkm>z=|s9nl4P$&JeQ0wcXtcT_}x~WA*o)<*2^{dV;90L zy2&Ev8%Fy7c1i@k%$34H!BRAp;6aEkcMaZKNlJL~ERW2?-x5b7jg0ghj#X4R5Y$~- z4Z8YXZMYfP_8OU3J~uHV)Ds%%T)dU1-X#Z<5BtY=K1xYZ@`#Z81Kl!IH+&$rR;b1u zuRs?`55@$G52}?rcc0fcG#J^LvCyg4%6|8luQYi)+u|nb07rcmg=;2|pH-$%vF0;I zUUThxcJnNe@e0jm zzp}fvquFB9Su1KlV7n+09n*N3pJy-sE} zkx^h1_`MFlURoT~eEVn#@qX<8t&c=Q(*kbqMoo1rfK=Fyw_QOHeO`Xpq*k<9Os)Mb=KYIH$E2(u-04Tr6s+gWNvzWbmL{x?t}JG_Up7DZ}_SA z?(}cfbr*^5uH@yUh0&7#pdt4Zz%>lC;CkWd1JB!3RxPh!P2s>Lj_fE;%G~Ny$V1Gf z8Cxv9qzCVZ?#o${4oq#U*c{N@-wR9Cb((>60Ihxdu$? zFX*ZrXmDohT>kQR#*;W$zJX|HM;ul zwq~j&#Y>*Hw%v3XpcjU{E2C!>d2}t7hulnYf7Y4?Rl`FlhBi$VDrLZ?i_H$d(mqvZ zkhInj0<1U$#)UYaLXS5Fjt|_dfK+!cE@JqPDAX_?Yk@lz5`!1+0AvaodeJ2oi$I%$ z#{AyJVSH^85|s(OEOFiZsw&O|=4VxF*EPTL%~lQ$#KDN2pZ_~E>7M?uuBt_v!Eut* zeHoZju?w{}+qmx%c^efXi38bh^N59__bRi_qrp%XV%Y}poD2bgQ?+u}J^=Z1v@=2xd&tv)4qt=&H`wKukR z0)CxBo1XBP`5{+gNlCFH24M844+Y-m5|}wD`h$XOzV4k89$oV_4}yTzWKp5bz|2Y} z+E#(Hz|Rhe30eJzOg^SH80_2CMZ=_8{AaQsSEJtg8MAsx=MQ2qp7e*cqCseLSvS03 z$<3cvqPgQM2#9Pplgz8NyuF*@h#DQ-_So2ZSoe69m%0%YI$L8V3g#7ePjz>%?V}?R zM+RdpQw-jS4_^2{=|C}Ofo{%~FfPiIt1~Jdo~Q=2#2=6y2UpiT&nZQuQgNNF=*TpX zIPMx8j5A~twkxGpnskx(J|`n!xl9zjpA*y4A_huQ1@*VLK7{Sx6W*00(LXf6dfHEa zEJCTKTJtAsCh#*;e1%Z=QjRHn|8=^kO9p91`x?)*8nIZ`^R=KD8}k1nUX4HM)6OO9 z@DsDB6YQk6TirPPv|fyr%l;(rf8Z0bZ<2pHi+13qPP;|L0rz$NxWn z=_{;$;-20`O9yH(L*>iZ4ivkLJEV)cXZs)V66XKK{C6-BSc^MsDN;OT9V3p}S^kS_ zPovzaL|48w_Ma1b4P;5*3JdF-1d?3&{<~-n%byFx*mHm7K@WE5q@FnF7guXF3om|@ z8)P_8{LdP{T%(BTddL2|kV)zZJX*t|hNJnvkAly{{ts63oRa1L`WK{?;{VTd@flJ_4_j3?=Q2o=Khny7UGKKdx->iCYp5G91!{x zTOfk;I1Dm$-V^?=YURiBrSFbkRka^{>Z}i<+m4pHqGcGfQK$vA)r(Es1_y==hx&rj z1<6qVG;6k1*g)Ypkx+-Tsp_nY+ukSlSA6#rOGyW5QHaj-CK5DU*#*+t>!={OXO3~M%a2ZC4 z)6tt+U(vQ(d;e%NjP{9Z`J1-l`QDN}c=NG@8KTlDpBl9OQw$}aOULw9SJdQ*?-5^I zHIWeBgkP&_kkYPdxuXwm*{!)cQ&FmZb$3`-o)MfOn6aIJh0GoeF3VnDnN-gSUMi{v zo$Kk#4!UyhjM475j*w0B;n`6@{P6u8VBMYBg*~HxmooCD|}-iyScUD>@(B_x0B;l#^V?+^}Eyxla4*j5@mMGJ?%GZkN)0_yL2;EtUy? zF`xOTr+-!OED8<=F8VLL?8~jnDi`bPJ)$W2TI)OLb06e7jX~VXsM|jysCTj?j+&5n&BVzef?Ka-^lr z8}~AhA?7L()3QXqcFQoCrWZXv?7d~sUV4ba*L9n4h7-c;#T(>z~cGZ~pxS^x5=t80FTSJcX3#4Xce|ttmHS? zk8N8md)?L34cw~UH4pvc^Pf51RraVmJFlK1BZE@PmzFARZ9U@`Qp(TU2;PD8pnR14 z$-z`cX+{=@t_%;5)gQ{|tw<5Cgu@bt)5=Y*<)@49Q|jy8#hBDTUyM-#39csEnxpVF zoR884F2$+=>}}KZ>jr%M;TS0WTQK-h;ElUKoRrs2oZYtLGY$@}gPT(haNdO$D_Z!M zfI)f#d`$psEl>N6US;`ito)?*z8XhC(rI=M@(54F@#TIjDyokx3<(J~ba`}mc_+$( za-QBfFc)^{lX|=uTOu@(&sgg^y?H8$rMH%FSB2z$9kAr@AnSQpS=vH8(ctxd)9+F+ zX=IUxn>OIP<-2C~Qj{``l;OU*EXr!Fmq;O4dIsmUali6Rk3WCnEN6!(w_u~OM;Q*3dhXsnVpK=mc!*oxjr9+k?k+LBo+^m778f^LzX-? zeMJfG`-b-%o+iS7nJyY20an%Hk}QrpFI$NoBP+A_2jyWWem`AW$w?b<)|54CoJqD6 zB-hrh6_PR|&1Z%#sy@S_I3F}pDC%#(CJtYUzvB~_6}|}PtZ*v_c@1(iLa)r7iFg}7 zvaRFGG{D=UFt{2(YS7bRt}3FOn6km>MZtU(pNx#4fCC(@ZVFn zL!2F5{>nA|^jrF$Q7o(IkbHK^X3tC4vje_>_8&N;YojabbI`+8mG!Nqziu0bb2nQ` zyIciLHay$z`?2@Q+t zSsID5YfXJ8A%Xk=R07{vmgtZ(v0!>23Bg3VD9-%r~T;B40S|o@nk) z7PdS2cma?sETBbLL8WY9NI|p%pjZGyWrv3IcN2g84%w;NdUd+1XsJ@x^PAHwg$Kc0 zs9q%2{bJ)$fnLoE3I%U0z-Y)EMJm{??nL}@M7WPHKr(eS8o9`2LFatw_|g@ zTYdBQr>Pr#BLj@?RDXsSLz5(&Ka87ev{;jbZ{GBiKt1u8N1C8~F8fSYi7zGZ18X)|o5Eoh~1&bOLL!^R9QU4K3nb(^ai(aC25kuWgQl1pm?DD3qK(9z>Nu*Rq$Sa_b zdjK3m&`7{hQB~J}--=fOJ1wgFt;w4VPTz{FGY+Edg6#e+)|_+k6U7z1bbf~fAHmV1 z5fmSL7dIM4_$oea3Ang~B&u?Ao~(LL2g?mB-+K=Q!zLV%wbkX|URus6sGy_%kQ%hS ztW{Dq7DiXFBczk3kiE#&X1O@V8c;v!1Sl_{j)FFRk^8@E0m8Gcvs;<5 zWGtnTB{6kAPtF|9%xJK?bTHX2e(Mz-d*ZJTfo+YoA|70pW}n56GQ%vMmyNfiBK9%r zda#I$77S)W8^hUVIrQu0iSvjJ-!|p*DnCnUx(WKST&cm`X1+B>XMrcU%X;#b(!u|R z2;ZnaI&`5hP_koF*ufqT^4cuQ1N0GKg}&DaHsq5%@suBLnc~?b)9AJBS76keHV6CG z@Z*yoAktfGa^0LvsX|I`b5D7Il5cXi;3xL^QaQ)~D;Qc1iB3ItadPTj9G<#yUY_VA z^AptvV!ypq!^vJ}ETzzP&vcbZPVVmEIacVQ45GP}lN6^-7vjjTk&)ayJk#b}FZ`?* zWYg4Mn~xWx-ubpR-*o)rEI@{Wr5T0$r@tRtU7c_jQuMz21wMd9I+jP1uD~h&sl(5z z*ZA1KBobp|Fad;eDF8rQ-P|0g`6l?RvRdmkxU+`#vWHlfRqtU-eNzK_xu4yQw+{ed zq=*Bjj63zU|Fw&d4&!h2#P2&zRe`PfRAy-6YRjKuM$*s%)kr0*toy54I4CNQHOvAg*ygfOE@=EI$zEK z!qFTQwnz3?U8^pPFskMg74ofKhlDFpX-(81xyNOrnz4sn z;lDBJqqLk5VzNBK$=5W4`-%J8i-a3M(Q6Eu78JE|wc&5)Y)QlU#Qoe2i~g%@KatF! zn=SvlIz74P;J3W}PJbIxy}7-d^ihg+36_3+DZe;+2mFZ6_VK99(V9Plz4&cNzr!EW z{CFWJASt7ho)N0>kpYa}8kj=&EX6vswSC|S17L!8Fq}e^i7DYLGoGgqFRwZxJ`@gz zBcXfls3JTA3P0tfZu~@+W|4xkKBT}=CZ2^Bz zlAY#{Hi}gU)r&^kkx}Fy%vK z=rvJUR&sLBtTHyZe4u&A;LZ1p+#KEf#?L0EoX{K>;BJhWDHc73RJnG`8yUwY^O!MM zwJx?3D*Jst@ftloxRE;{p21P)?e(75*0!>kDSpvZoAJxAiV55=48%3VodV#w8dXLp zkg_ESt6W-YVYCc+{bH+zEFWDRvTx6$E8L4$2JVE;#Ym=0XZm+H1h=P~P%-Y_VFddX zIwrhjQb(m>r;LOV*ctYOSY6t0B0ysN!nR*+BqQuY{zQ(y$HhCnP}CmS^-K)f@Suun zF8D{q#WfEesc7-s@TO?g@#kwT=bhOZBk19~?YSa$!^rpcj+LXlzj{gAeY}H>bK(k; z=`{^PtBRiNSZL;T7Tq+vQlPkIfKfD0NJy;GbtB(nviKZ^UzN_xh@|UJG}UF~`Nk<1!NyV5qIpzwHed4n8Z!Ul-mwl))x% z_bEu?0{#3Yf3}Q0L@S0VG$5f+?pbqrym$FQymw_wyF6xVef?WY2AS~^srZwL`m1d7 zctNrc%`Gis=6J38wMZx-UeN(^@=}I#LuKx;jBzeojVx^?C3G@)+jY|qF^2OClpoP` zgdjRd(ce4u1mXeRbMjN5Lf|hc<01A^^oMh84~S(mk66Pb47ZEyl6k8tDp=o;LBTLx zA!nN9N|L&4mY&4(TR$Rz8r-y;3-R-NO0?Zz_+PdxwcO&}GFSJ^&Arf-ze6ror5wBq z)#i=pX9T3#VA+A4iiuBFGp~bntQ{RW=V?Vco_Lpf{OtA1Q&1KVp7`#@<|ZNQjj^%1~#3`Rw?qfX{6kJBrCpX1u@3l(bORL z*G!Rl$;XGCmm11fe$66rQVu0p(zzTl>Re1U)5dknp_1lOA$W%@lr8QRg7fNG4+| zE4iVPrvn>ON3-+uc#R7qOMo#|+bA1{kDqi{+cU94T=?+tc*cc)7j( zi;Q{)JCStlWAA)So7qYqdcpI3C`ef#2-$iEq-AbBU8L79kOLn1@26X%dkT9{P(Qo4 zb^=hjk?r#4LXga}%$If6OM!u1A6jp1F_gyHZ)!Y9P_W20f4i2*(A4_v%`7MNjZDKq zfbZeAi?oy_;E$Sx`O7B1@j>ncGRT4U?_d*mpr%R$WgJq{vYqpggyLe-DDvhH;9Oy;b>NEKeIZxz$YueKXa=w}3~~8I-iKzi^x7fs%CZ%2B%|(~mpcx{y{%vHQW^D+ z46t(>;QyVdI`k-xwO?NmkD_SpIM}8EFJ*?HkOVHp+6L6<=8(AuIY-{C@BG6w2%=_^ zX+9})FlsLWPg9R2t1grz#(}0M-*M+g?oT}|s0z~G*VnVShzcS@MDn@hJEg4E4lb+P zr`K+ohRdZ@UA=iPvB}>j294^m2D}qjint$cEpiRX{g0tEgpF`MO*l3B8_~X*#T}Q2 zMOR-bdhMF|=*Ldn)FlXhM>3*lzg9)rA|n;4=m3=d{D9ZE-eRXANMa;@{QD%2*CN~#* zFc7c7mjrWun;RDNb=LZwYjzNaBs2fnvV{C*o#!EkUaT@t+GwO0hp-}cx~70v#Ceok zJ6T953(1VstT5;F%=n^4W{Hr6(VYwF&%O|O0L2#PdG0&I&vz!ma=pQ^i3EE1Q6=a>MFfnVL4`zwLQHdh0@0*V7?dzXj-GB}N zH;XWtv-KXW3pi#6&~@Fw`qqZW6Se`YTWN2}uCKqnrw z9tf|-wJcDX_PVWLLIH7A!em(%e_|U*Jp4{@P6VFFkDOH>eBMV@1qbvDCe+!8FZdAm z=y^4f6eYn{5YdpBgp`2jHbE%eIW0e9h8>|b9Sy1w84TqLbJIO4>bl+@<;r$vo_Ab+=73t$5Qc@sOJarN=& znVsGb4b%B37frrvtXP~0_ga0Y;^JzSv~xmW6fRIaj_>G4HFcIi1nNX7mof5oxDkJw z`v)x&Ppuj{*;Go+@}a?AurWw=D%Cb)onb!nDqkomhp9ODwr(85ouCQ4nVTUnHv}TJ zm{F}-wCy@BLI^@ zu7YahL~LV&pwXKGQbFfXaJr0l_mf^^{CxLthGse*5<9k}#GdC_I&Px&UPQlo|1I^r z!~GODp?Nd~>yn^1G|8ncXyz?zol=c`U@hnp{`j9t-+R=NQcT%&o`UMmhtvRFQ9b0IUS?Nk2%!q-(jdR5`mQ^-3ihV$ zb3j4@A#o(2>5F$|5fk#IqNbLTm8B8XzLQfV2Fd56Bs;KCZ{Jz~-V0+|4vtvR6ejlmeMLo#A8vf`{=RibXQz^C zf6v0$ce_d)@bm{xl)KK_0C9DW~wF+Gj{hGyW+$hmzz zJ;5*VnO+joi*^RO$AhAANm(r|0j&~b;2ZqK-1q_@9aC97nXW0Kg@p_vu4*!Xx+XfR zc+yz>6L@jojr_`!w(E9c?=+Un{VAwd>Qls~BxnB%UBRyO7*w;ILOP!Wki%-V$o;y}!5-G|7gOrLY03}SG!BZgqIWlF3X_=Be7}gNET?njLgZz$ z_`}!N*Kq_TUFApGL?j#?IRJB{(HUeJukkJ#Fz;agR@=@}vk|!2LlB09Cmu? z1Vt?p3&lIVcsQEi2^VJnrtoO;!6^L^=J)!)WK;f$q7dzeEDvq1EQe?yZo~d!j>_gk zaLLF53JZfu%k)Z^aF_kC{6%^1y1xYYA*Q!^?H!%FX1gzcb`?NK0FEXIliP_7+3Mua zFK3~r4=LW4O(#WLLd#$c+2bu$Y}GMm{6H6YQ8v)uPkFP;4Iq!VMGsj<+O@Gev|`QH z0N~(QP8IciUp-L5%dPHwm|7Gj?n%0ke|9kUx6O`1o#UnUE1C9b1%FIIcAhI>D$CX}_MC?M$PKUK;5nEJ2_E;k4` z?@BLkA*bk{``ErD6L8^flb4oW8?Nj9lp{~Xy&DK$mCQOAYbeTgZ=COIF(U}*K^(HhTBH}UZXJO&VHUypC?E2ah z)*VpcIJ~tlSpRd(C5D%^%3x3 zTLch0iV>orJ>w=PgLBPKv1oU`cvuin2SFriA#D)?Ha+^86zL6`ZD}deXVcG)$Loyp znF7N_oxvQ2H+-pFwjX4NY%)nMgiujKn=jiSjOwKAIxvsuwdud~By*<`S=5>C^ ziIp}}RPT$vxp^4Sv0ZKhtD)VDCnDK2O3DG-gnQ?2-#K}e0@AT zw$X}p@1N*ekaL89?_MpseH>jY6HfHG34Er0Qk5)WwF%U|X?2mCy}q*K7>C z^*C-w*LV8>vybA1Vr^q1L-P=epd%*$Y&Y9$*%W|D@qG^6qKNBYxniA~sJQ&mV^Hz~ z>hH$ZY5~@PP9}h-pr9ZmB(y!AgTl_vzIh55(4BYwK2uj$ABbn{tTY)sKA<2V2+n5M z6s4AoVmT2SA0Kz#okaEW@&Y<*w%Mb~BSWvuY_dQJ6m72U?SUCDoc9}o0Dn1`3}#x$ zzqoMk=qz)**jDnrJivPVLKQz=4aucq7yo($ytCy+~I$BYd&3w zF{th>*;H$Dv6G|^KRsOq|8vZotG=nJ%IZARsN3Oq(&A3UIr+RNa0M?cC9qDcN z%8P0{$XRPynN?E0=6PrI{#;EOs9J-c|LknO`HOa0yK^V2F0`-+b~~bU(d&4Et&Iav zu_XF5#mbWjzOh^{LQ3cJNL{|ah^v4#r`Y)clsRwI=d#t9*(Rwp-Dvz+0Thv-23)m8 z#>Fx7+66%kwlwB`qEdEITil?;T{v}0WbQ!-_4O%6^y~dq8PSCSqYs@3k9)^<@^ULNxaGP=S3Oa+TxGm*cD&y`|>qY0~SV^@RI z*7kG>NdmKao>Uy2f5qJ-m~Ck>SIvl|rWSOM@VYo!1sd3XbLiD{vF7_|a^Y_g5nWSL z3H(l*<-WI`uKP3ZWM$EHn_P2U59X?E7aIeY$tVLE(rGXcC&mn^hy2RGK1En4zm95a zc7W0$B`_gB>Cwjnfhjc=2abQiw)w!*XFtdBmf$%BKcj&(Aq55pE}V1Yy+5P}3V0|85hth6Q7h`epJyJ=6yxo^2Ggd$N68*=-Z_^4_Lb zA^nH_k9V!Nq*k z3%b<4w3NBN{<)`FFjLs;?9o`ZxRa@$(#6EgT#e=5d^d%E3$;$h@mvoV z2wC;0C@H^yvru6Tf6S!n@l~Y7>lhw_`>5U?j)P0*+gD-S>)_~U)Nu{_d%80MDy!4` zDHJxqr1N-Y^+Y(dXRKbS^YK>MrxtX9#T@>B7LaOb;1$EiKCZ2ZM3NwQ zxHAi)%F5XA2a=c_=YRY_LIScco51vQ+gYGguSufYz?h1X;mvoDfQwB?P&HTo2+mq| zj`0f?lp_Qurd7T3CC+dv4-Z=%CmB68C*qC`bIh^^-NX0gMBXTkh{%`SslrbsmQ!MN zEw01K%}1xF?Sq53Bvw|byjBC+c6X!A!}m!Y3Kb4YT|J9yv$kb;jUwFKDbEJ!CaMi3 zJ?fyKyza_`$k4q@|OwV2$&4f!u{(JeW8(6W5HK< zYc%N@i=f?sMNPIYyYy3uG*OB6$;#F6Aj`Eau^h4M=gIQl3sEiom9RWu#dQY~P}{q^ z11O*LtgNq(G@ylOo=*sgF-?J@JwhZxGqna^FHV_l?h*R; zIz4|{?bh~`gQrA?R_h`Mcdo5h7g-;K5@R<64pnG-W4hq3=ezTaDHUf236ywlWk;P#YLOT6uZ-2%jyvO*Wk&{j}Pn_G{Sc z;ilUDvS4W*{m`qFS70VM;J^0uJlmFU@pN%;WZ{eWhgBqV=@xlqcei8SE>fZlqSRm{ z4mOEM=rcomJAN{kp^z2i{twVPGp#1ndYPG*Q5ANOSCt%21$e~vqINk9hN|!1Yrt={ zT9Y}mmPTDWmq+Vnu8Gl+dB9Bl-YBw1_KuF(-j~PT*9UchfnYQ$(b(SUCW??}OC~T& zn?ot@Pj{zwmRbZKJ$eSa4?-gZW@fTbb+EY@=)H7dFM@#fKbMHD-}-H>9=a`_r^$kD zhoU}c0KsdO0&*BMRV0%!S991xc_a%d9m+&t%ST75M}vY48@Q?e+|1V<3?d2qt!?enT0u_kF9+5T}G}iqP*rS8Qf}pi2f{v&EE5 zt0XaB&iIdDmHTfBEuA1r>vqpEf0x+Y;}(Il6Lkk_Kr(M;J}l?`BdjopjNB zIgb}9lUyXd$vr+Gq;{-jFdPXu|7)9;`+~K6~bnMfIWIQ_BTPX39PA$Jt{x zyWTZaQa-(Sg=?rQfN44nG5#nm&tTuWczs7xEYA$&_vsJSs?uT|ghvGwU+kvNn``IE z<0p?bYCK;9QFxmZjB#PVcCAvV5rgFC7u<4#g9NzlHb*1<95(l7ABP6)r>9eebZp%D zR@K$zybp1m0rc?^^xWJDeSLd6t&Tyn`hFmQ!^hZzY`GR!s3{bwz1}`iSyjfpKZ1_Z z(9>5rUg8w0H^nL5JDx#){mSDoo>Tc6z^quLhB4>1-*HAJxHFsM)oOg=b=QCGjnW;U zn6HMhr zSXg*Ngg#kfweL_cv7=FKjtzXOo0AEJX2gh~^F7hfP&=j_qw z^yL%<>uz|Ldyhdo4}IDD7Jp-anB*69nJgeDhuY6}p>F`D4n5fDp7-#i5E>yRjc6;5 zi-W@L*=BOtDd9YNnU~?(o*owt%mUeCP%uz7HYNu7Z373TGwhhE%}%Gi%#St4CrxDX z_bi^c(qWPP&wv2j*;zNH@AI?#u?Z%{b3V5ceBi>7;esL!i;})RS;;a8z9%V`G6y9; zf9s#d_4uc(y8Qj^@3n^p(F?!q@3UB2OXv9~zg)Y=0?w>N8+(`%wf+W(LOt#SuwEVi zW!_(C49)3{;V%jCi2ctp8rQXb z_tYkZqZy?Y_7aCJrkY=QVUe!yd4#8Mn~_6%BWmkg3JZa+9{)ZBvjWT@+dqH}p{us} z`kcX*?R?2_aKu!V?c}tzwKM(hJpLqGyTiK)!8|&lG#;A)H*fHCP(H7yI+ZT;QC_|W z0wDyp5VZ3EBh77>m7X3^=QjQx@F-`~NUi-ycFccMy&kDV?P09aemKW%CDfh@Q`cB1 z(@x6YncmnDgYfh5y>SWK_;>Uw&JQhQn7;V}MY>+@WH2IBh`lSnSP>Ud? z)YQ~*%f9zR;3aTP-blB_rmQdXgoGxagWWE4j zUZ(IDM{K2rU_agrL0TKn9cSROTKFCjf!?ZFUfpLSdbLe`b}-*ts@rtLux2>4)*as9 z4yW?DK6~x#b1+wfpnc`If$7BOuomc1-w{JCNhIva1*!_h#uPEh1U|EtyRY|QJ2?W- zfgBn1a98c|+8)oIjJ{LahSc$P>c7&OqZH=A6JOoQM~2@vvW;0*PZo}&o6)NSzhvC9 zq(C(XHLbP;lt@|?sORIWcPKcW-55%s-)?92%72WYWo9OGbECNN9>`|+9+MKBrSNLs zn(V@AkC>R(JX${KHX5p~`UHu;(Ym-=?HQ9@ULIXsdhA;%4fTM^L$M`IuJ=vr>=-czRplyXgrTm{qkAgr^fPwCX#0$KmZb&am z)$9XQHa?zIg^qoGWo+aBiqnkUee92*e2{jH>1$L}-lMa#j`4Qv@NQ7$dPZFshVo1) z-?hZLZc%QYrzBYfs(jTZ@a=H1(ZI^;{Wz7l1tgCkvOa!@b>SB`{bbnv=m}2iEIBURZ`6w+- z1yI6VnIsO|1->QUYnwu~;ezxEzkATtLSYsaC=vk-tA*7Y!^*4QMG%Ev-j+*?WXsC{V zFgW~^@;DrSX=Pey3QEB3YM zZ?lCP(u)gZ#R~7&APgJQ4iL%qo_!M=XIFWeRu;twkCU8Uf6uPNkSAU(GyADz3qTY#C0KOZEXYAFvoti1IgJOl9-2@j{@K?DYlir-{GM8F7dF@7OjpT%?NkPEtN5mS~9YPZfbOt%2aDh@Kzm zxWa&n9yIH1)OMpjlFt&6t1#*&VmErK?+t&ZTBripkaDZ7&LMLIfMCh!WP4nv*&W-@ z&riT*x2rGa)t;odghZv+xh-%RfwyY}oZ6F}iI9~QgD^bC4zRNhZlfAqhy-=LRUjmj zzm-uy+$9lBUJ~|#>NuK%CO_FxH1vwH!G*l8+o=EeTLXcD!COjZ35I)95WCOJhiD0+ zW5=Kjd=C4EO9f^_#XsAM(5{7DBw{W3@gi!zJ-==8P}$b&i`#Xc6mJ%OaBMWm{VF9k z1fYv<;11Z>mu{#mT7ki*S(UCtR8-N=k*dO2BM+@aDq@ax`Lxf2jWR z;s3Pu_QQWZj=#FTJm-1aSQGFP+rwYhzXkk<$3AdQzh{;%qZSW;<}kD?JAV@+8H$5) z+{H=kBPAm!)x$Oi9wUfrVPW=$xTTovTc2?+1d zNV=LYTL^A#bNf-I$-mzjofhlEI@~OJd^@P5B&+5Lw#WX(<)y=F$FnFh!Myb^2{ZHa z(2b3ttgNNZ59GAcq%Sf>9_xUK1Rj!JuC?L#E>%nzpcW5FJAu``s6>?{+~D2wnF*G$VT+`sfC47 z^00${|J>@gZwvHZ);2Bd#Ar&b%{9gk_xF23i@6>O#{36$$9`+^vG}v}pX+dc|ITMm zd+nc96Y%e4kK|Op(`U|-hG*#hBTf9RuPs2>)%8pAaK-e$Kj4lQyfP&jEyjoSd>`Gig=z{iS={bVV#ivXE|bp zBl+CBP5`aSoa?rCuTQCNc#cGdX9SrjoFa_L>$$aL=wa;Zlg#rynC{{14(uD(5NU z?gFoG^bY3R1mh9^cP(k$;`#b=0rZNi!W2k>Mdn+u1+a{s{{Ee)YobWx^o(=|dwcgE zTOv+pEUHBix&oEwxnfL5Dz`lk{E_JbE?1dzgL3+ggA;=Z-+X#Qn^NB*cnq*+|Wn*~Njx(ARUt|!u5qm4X9Nr^?HI@xC4t=wi1xmidU zF{x*J6|23oW12X+++NPU2tRT3F*vx3!@;$)Kk!7q3kuT|jF%+{588u6`e2!LUd;cl zi2`OMAR#sGRapOx9Eti{F^FS>8FB3YrAx0RY}T5tcvJc0aGuR+`E->8l?lIN33mRd z-19&nwZ>eoL0WZZvIZpti=uy_&J5PdWjRfSxPK+HiMKdx<%f?94C^Ne6E#fi|I_OUirTd!Ft$;4d&L?lGngg zUfa6#ZCx2iywT`fqNpvm*uz2kB-3Hd-bW(9nNx{A>fhYXwOT`F2H_20D$>Pz)j5$sGqYXWa^!u~Uhjf9l;8DcOt{9xZtJbal*Gja zp64H>&B$(}sR=W7tC5dqlGbepHGi_(Rao>%{J{cp+;ytk&fgX2$ULl2j32X{YCRS? zIl1$}UsV5FQPP#`+v`W}jTX3xul3vAyv~)%Y{^{r7sMxeBFif(3|H4^-MzdJJMW$TEl%GJs9HVjGyH2qJO-l^#9hGEJQ`G0I6%rk9>|$hT+(TC zNOMF&g2Q2f2&A^q{>*pY!J-Zp>Ky_K3Y^k~T*7uZMY@5j53n?N`wYAx3P{VY%-a|w z(%@)=&K|jkV*Ev~)*MUo1eOV^X77b$E<|^eUO))rssw3C>Uo~grB+vW_t88IMYG(Q zBXZa6hv8zahvlHbo3VP|kPy5bC^I1Y9kddEBCW*rL#5~Jgloue&~;lY>_J}&=}40b z{nIKUa&t3ShBR5MM8?a@%VRqiQB{S@UQr>mSj>pDHLCwZW1MPccJ`5?5JQf$p~_?f zi;aYY#3RKtBaH>Q%EFN#JT~(9{F!^!{ML0R zho2U462+Q?BM6`Cqs}kSgIhScAQg8Lq+}WP!&^~SB5sdg5cUoahfnQ^=6|}JbN9Re zZ0ZA>HiLZ5pLq$;R7x-KUZ=YDnhy!oZ?!13c$97_8X2)w*z~G5UvEYX*(m2>{WLu_ zoh+D6=8S2p@`XOmF8i>$2UTcNV^f@AgU+$tIWn1zkV8$4gx+%5Qt#+#kuIUBHiQK_9ri+xbXE86j(iN#~~chYZn2Z+&^~=7c7a zei)g|)SIBPtFytaA?-*vXV;X8W$7c=c7B+D<}eVUeAQ3Di5U0)n4OK8E z?8Vy&i3|&sGM~*F7IGrTUayxPhfj;9ecCq$mB7%D@!Za$cqXOQOh58}6@KQ^hh0Su zpmbWO%g7+J(W?1;n(6|GfT4SP?*STz#Go^il_Tj#$IT6(NkNb)Ot`#S#%Iw$0w+cu zhg3(vt^$dGB{1-*F&D9BxjB2Tbi(@8sr%omOSN;ggZY}DHhXIBULM#gLeH;7ah|z_ zFZw^K;=itdx$VldZCzK|-XaI1`w$9hYtPkMBZv{Vah@=NWk51v#EY*flHi1t=DlHeSOS^Rb^v*{I2J&T>rRP}NgL0g;MXtM=0*P!~{5Sgv+r$@UjC!+#rL@x2btr5klb4y96oaOeaS@P3gjC4|6 z$0>?`RTF*6G@tv&Mz=lbj!2SXt*S)O5NGQ9$D>x#&B(~uV<$l!*ct2xJxfoYKV8v9}^Sv#Lwkr)@Vv^^E0$d)80~{ZY7$3{M~{v4bL-MCQIkPCzi|`O3SrC*}DV2 z7AQ9nw72JS#vwO^E`m;Ofc@jNQd)I~2%hHZ%)Z>6EbY&PogF(@<+*#hum6so{>(*e z?{d1bIqW`U%IS4(_tPOj{^IIFxxhe4j2W^4F-C#S1cQ?sM!?w3)+UYww&MBY7fFAn zxJ9u;T-Odao@Ovkq@(X9g$2+^Z|wBy@OStL%?_V{E0Y}ltp6{&|cX}v|+o^8?I+{4&~ zY;;ONQ`ixlbiRBED}Qq}xco4EgDP3~H(^`7YtNis3Hnk|_z00{YYXaa&xatN?rkzA zZe{JsfaO8eULs`4QN>5}x=r#UW|KiU~|LuL)xDjQ6`K#EtxR30#0M-OHtF&9U z9nwpY!yZz0>qLx+lsrsOYkeO}fdyMLUBdwLYrxY-UG*hV=z%i)DBI`&Np^(Vp8t5C zmNZlCf(p$?{{_xxro|E(#Cx`v?q4_U)q}^WH+uF1QYFlh#irf7QhT6Gr_kp(^tD0% z^Ss*pbcy-A!1d}y_~vNCfk(nXf<}e4L*lLc&6)a6!@DOaZ_HQxhqiz_^-E?eDrGcZ zJ}s)QjxZ`J%6hgD18CKfRPM@ZO|U)kw|6p$5GN9^pyQ31a$A?os|W298~eZNy7F)+ z*ET*9r?MTCoyi^{5@j2OgAk4-Q?{{Zuk1@k*~U5vgP4)55wgoR_OUMsX_7F=u@lBJ ze2;U!@A|%fzW1-0>zenS_qpHuy_etbe(pPoY`-AkGG3?;uP*XaKFM)JcKAxL(dFsh zZ|ms+r2ty>K3v-ApG>zt>(5`Po~-jZ?<9a+{JdoSb6CW#yys}`JDL3gX)LviRD?a+ z2Pp!>(e&`-Ek#F3%O%p!wv?;v*C({QqZ=|rMfK+`z7GRyLJoJG^f;Wag?{lvT)n2M z%3=*g?n1wGt*uuksO`tfRMv-Kv6h&pakUkdmH4^chN-ZlHJtY?<&=@Tb{oa570LG%RH^uSNFkVv7smUd=q0_X<4ch ze+Y$gdA{$yC~PJWGs0zsqmfQGA}=jc$cHqqFpg~#i@Q5_*1Va3J!b%t=2_w0*pl!! z&-y3l2?8#VitSpO>+0`Mt9<6bJg}Fp9;LYV#JW%)ZgxNjs)Zt-1bXx8bxTgW)js-~ z1a5kJzSlroyDl;#LsUhPscljLdZ~B($B%5w_tRA`rB)A}obkT#1qug!A&S*O3ftA- z=`{{7s>r)pbtHIBAf&m(pe&k%n#olB4K9XXYp~=U?nPPPM~v?E_y@7irm$<-x!UO_ z(P9A-VmJSFvP0AY&=pIh_?N|X|HKXUk)(^pyL~@S z!aOLqZOh>m%C@DQtQ;?W7$Awi@e2r?2|6@%joR$aAdf8HD4K>1ow5ge-bLxaW$^pQis!^z+40+NJaX?lINsAfXSq{PyizRBUX! zeJ}B$vcT55y{9L-w)SR3#XE0NU_$-@K{QQFE=EU3Crep!0S>}7N>Bg|N$TlX8Z9V? zO91HMfl{W{D{x_Obh8S|%VSzvZiBpAD59$4%DC3^^m8Ud}q7InljBn1( z!wSu@yE7*eu+ddjvK;YNj_3ae zH(AY*(UJv>+oW~>DUPP`2ey4+EJfT@TsHWN68UgZr3-McudCheO$=f|V>B~9wT``l z2eIQks!s%n?n$BvIhGmYCyzCL;HD$C6J=JWcIc)KZjcE>*8r@edJ15eH7kcsLz%#B z7y=h^4SWNbUEaenLqN{!sHvS{{tekNCO558osPljd;fBfVC$n!*lqRCJ3*ov*tDMN zT%Qxs%XfKn3Fkb*6RLAb94=XE+PAl%7sZtuPCwMofQ7v=;twASz5p?H5l@0;>R5%1qv6OIMaseROYj-~G$Vx8lxG~lHuARNz^Gf(9_fAizLi{FWi*s{@ zXqh;5fJtxMJh*LZYb*AUROZ=dUh_!57&8DM8VKSONh}!V#Mgvdy_5ZdCVg|sN%>?} z_xi&5FPr4N8abpiuJ-Bm4}IK z?4$f58Jq@sFM*zD5kL?d$4D*a-wo4xjA66$C%H0D1ZaCCvEJ(H+OUn zntokSs&QYaolcPP8g~oaS<#2X<)kcQx`Z>*#!HTHng(Y1zLbi9W_IB9{>J>e)tOmY z!vL2Uae=L|V2**7`rW&C;mKm^2!u>%|H!${urtnIb7dd^4(ZfQ9ewX?r+G9j4FR1G z1CXREjK}_{qHI$LNC4irrs{kD^#v#AI$>OIB6j-Uu>~1mKn@!tFHEnUb|;O}$phF8 z2au_Pm>+RHodafj5tNV(#g&9m>Z| zhs$;SPDy|;3VG)CpN0k7pfI}@-CSKx1cWU`Rt1 zPh@GG_eYXIlZ-ll88gb@UC^eCepl4#%AH}aWTm2CTW>rR z@50_3(p2_V$gI%qgcNSzJRI9**U!_ds;UM*dj`il3eUKjmD^0Y$d_8H??2tU*^it$ zVCX*%W^4-F{ZTxx>pXI_%S=aXo@`x^JjuB~z}25Amtlv84xtJRyS@UNKt5@sy7-)R zLrnbg#Bh^2JA{^jr)96fZ&Pg=)^GmdB^VexZI%i24_N?M5wM_(SjDPSeeMUO_S(?y zO#8dhv|lqO_1;KKci|NfS2DH`*N>rn_#<&I{@bA$H(5EAY*<_;qLPv`!{bXNMUu`t zIXN9sj^OwZYF&(^(?Og8)z6WptL8Pw=tO9o&G^c-H060gwccd@DxG;{!c?`FmXvjK zTSpIctNl4On5_t7gets9N*aA;iB@H|jzgmtds8@GB^~R8bPx#JYeDVK6g}OAU|1}O z3mf;xiD?6lU#p$t!@{TmJZis(TL=EL6%_b_yofYB(|#%vUL`+UJ3H#op4?Auz*{4n z<4>XTfGfay=&}zi=Acz=R_h-FjPQAEEZux>?{K+lbySc7c;7C`s-@dwc=9S0y&NK2hej{gZBx&c%Jut2I)^}Y-76V~nHU6Et1 z8YQpC0#2F`%y}pXCpV`w+^ujpec-u(^@c$LzYieR1`o5KGPF9 zro|XwED@WZ9Qt2VXi7`>uUMB#Xyzoo8-?-n&(N;Z^S%JPN(GNSIfixvaCv?BT&>zt zKun{bu!_j6&KZEZLcv@;Y3c)fN2l&czjYldEe*ca&@fu9D+&fE2TY&7i{E-*X4+N+ z@&oQ${-Fd$0-ff%d6u>?{N-s>@huC50uhdS32!7y`2}CZUexHH?3=rf+Y!?C0Y^*Y z_!HwBrg#31pfog2`Iys_!14c>i2tED#0hCy6J=9~?Spe3-?h8?2v`wG@j228V)cVY zg+nt`$&h$}_P2Cyo0ags(oU%HAhs4&&rEulH_2zB z!lI66P<(N7q6RWcIR<>%Vy~~^tpq^*C92ZCsnb2~edS_a{q(9u}y{||4K{+>4mr7WN)!s;}b2`Ul$zGf>| Z97CmFFx8Rh=Fkvu-2Fpeqf`y?;$N5Jj3xj8 literal 0 HcmV?d00001 diff --git a/web_theme_classic/static/description/product_template_form_without_module.png b/web_theme_classic/static/description/product_template_form_without_module.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa5acbd9aa47bf040f37b6248ce250af1412476 GIT binary patch literal 63244 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 literal 0 HcmV?d00001 diff --git a/web_theme_classic/static/src/scss/web_theme_classic.scss b/web_theme_classic/static/src/scss/web_theme_classic.scss new file mode 100644 index 000000000000..68dded5a79c3 --- /dev/null +++ b/web_theme_classic/static/src/scss/web_theme_classic.scss @@ -0,0 +1,92 @@ +/*********************************************************** + Variables +************************************************************/ + +$input-border-color: #cccccc; +$input-border-color-focus: #71639e; +$input-background-color-required: #d2d2ff; +$input-color-placeholder-required: #6c757d; + +$button-border-color: #dee2e6; + +/*********************************************************** + Form View : Handle Fields Borders +************************************************************/ + +.o_input, +.o_field_html > .note-editable { + /* Add border for all editable fields */ + border: 1px solid $input-border-color !important; + border-radius: 3px; + + /* add darker border on focus */ + &:focus { + border-color: $input-border-color-focus !important; + } +} + +.o_field_many2many_selection { + .o_input { + /* Prevent to have double border for many2many tags input fields */ + border: 0px solid !important; + } +} + +/*********************************************************** + Form View : Handle Button Borders +************************************************************/ + +.btn-secondary, +.btn-light { + border-color: $button-border-color; +} + +.btn-light { + &:hover { + border-color: $button-border-color; + } +} + +/*********************************************************** + Form View : Handle Background for required fields +************************************************************/ + +.o_required_modifier { + .o_input { + /* Add background for all editable and required fields */ + background-color: $input-background-color-required !important; + + /* darker placeholder as the background is darker */ + &::placeholder { + color: $input-color-placeholder-required; + } + } +} + +.o_required_modifier.o_field_selection { + /* Specific case for field selection */ + background-color: $input-background-color-required !important; +} + +/*********************************************************** + Search View : Search Bar Input +************************************************************/ +div.o_searchview[role="search"] { + /* Add border for the searchable zone */ + border: 1px solid $input-border-color !important; + border-radius: 3px; + + /* add darker border when input inside has focus */ + &:focus-within { + border-color: $input-border-color-focus !important; + } +} + +/* Adjust padding to avoid items to be sticked to borders */ +div.o_searchview_facet[role="img"] { + padding-left: 2px; +} + +i.o_searchview_icon[role="img"] { + padding-right: 2px; +} From ac1485b404f5b2976c014f69052c12d58abe7f12 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 13 Jan 2023 17:40:14 +0000 Subject: [PATCH 02/32] [UPD] Update web_theme_classic.pot --- web_theme_classic/i18n/web_theme_classic.pot | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 web_theme_classic/i18n/web_theme_classic.pot diff --git a/web_theme_classic/i18n/web_theme_classic.pot b/web_theme_classic/i18n/web_theme_classic.pot new file mode 100644 index 000000000000..78d58d53fe07 --- /dev/null +++ b/web_theme_classic/i18n/web_theme_classic.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" From 0ba437fe188fb91acf35a2c7dc6c4aef1df7a7f9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 13 Jan 2023 17:43:02 +0000 Subject: [PATCH 03/32] [UPD] README.rst --- web_theme_classic/README.rst | 107 +++++ .../static/description/index.html | 447 ++++++++++++++++++ 2 files changed, 554 insertions(+) create mode 100644 web_theme_classic/static/description/index.html diff --git a/web_theme_classic/README.rst b/web_theme_classic/README.rst index e69de29bb2d1..c0dd71da4d77 100644 --- a/web_theme_classic/README.rst +++ b/web_theme_classic/README.rst @@ -0,0 +1,107 @@ +================= +Web Theme Classic +================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_theme_classic + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_theme_classic + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/162/16.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extend the Odoo Community Edition ``web`` module to improve visibility +of form view. + +**Rational:** +In Odoo V16, the design is very pure. That's great, but it generates some problem for +users : + +* buttons and fields are not identifiable. (we can not know exactly where there are + until you hover over them with the cursor) + +* there is no indication for the required fields until trying to save (or exit the screen) + +In a way, this module restores the form display of version 15, but preserving the "save on the fly" new feature. + +**Without this module** + +.. figure:: https://raw.githubusercontent.com/OCA/web/16.0/web_theme_classic/static/description/product_template_form_without_module.png + +**With this module** + +.. figure:: https://raw.githubusercontent.com/OCA/web/16.0/web_theme_classic/static/description/product_template_form_with_module.png + +**Table of contents** + +.. contents:: + :local: + +Known issues / Roadmap +====================== + +* For the time being, the module improves form and search view. Some other improvement could + be done on other part of the UI. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* GRAP + +Contributors +~~~~~~~~~~~~ + +* Sylvain LE GAL (https://www.twitter.com/legalsylvain) + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px + :target: https://github.com/legalsylvain + :alt: legalsylvain + +Current `maintainer `__: + +|maintainer-legalsylvain| + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_theme_classic/static/description/index.html b/web_theme_classic/static/description/index.html new file mode 100644 index 000000000000..d70a75674eb8 --- /dev/null +++ b/web_theme_classic/static/description/index.html @@ -0,0 +1,447 @@ + + + + + + +Web Theme Classic + + + + + + From e47da7c6f35a8bf59659fbc2d918e125d59de05b Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 13 Jan 2023 17:43:03 +0000 Subject: [PATCH 04/32] [ADD] icon.png --- web_theme_classic/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 web_theme_classic/static/description/icon.png diff --git a/web_theme_classic/static/description/icon.png b/web_theme_classic/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From d801a0d43526b38c606ddba2fb88524787b07316 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Tue, 18 Apr 2023 16:49:22 +0200 Subject: [PATCH 05/32] [IMP] web_theme_classic : Do not display required color on readonly fields --- web_theme_classic/static/src/scss/web_theme_classic.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web_theme_classic/static/src/scss/web_theme_classic.scss b/web_theme_classic/static/src/scss/web_theme_classic.scss index 68dded5a79c3..42358fe022c3 100644 --- a/web_theme_classic/static/src/scss/web_theme_classic.scss +++ b/web_theme_classic/static/src/scss/web_theme_classic.scss @@ -51,7 +51,7 @@ $button-border-color: #dee2e6; Form View : Handle Background for required fields ************************************************************/ -.o_required_modifier { +.o_required_modifier:not(.o_readonly_modifier) { .o_input { /* Add background for all editable and required fields */ background-color: $input-background-color-required !important; @@ -63,7 +63,7 @@ $button-border-color: #dee2e6; } } -.o_required_modifier.o_field_selection { +.o_required_modifier.o_field_selection:not(.o_readonly_modifier) { /* Specific case for field selection */ background-color: $input-background-color-required !important; } From 2a3c571e25d8f8378ca7681ac2ae69004cf7dce1 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Tue, 18 Apr 2023 17:25:26 +0200 Subject: [PATCH 06/32] [IMP] web_theme_classic : Do not set border-bottom to required field, as the field has now a background-color --- .../static/src/scss/web_theme_classic.scss | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/web_theme_classic/static/src/scss/web_theme_classic.scss b/web_theme_classic/static/src/scss/web_theme_classic.scss index 42358fe022c3..4bb6d21dfd00 100644 --- a/web_theme_classic/static/src/scss/web_theme_classic.scss +++ b/web_theme_classic/static/src/scss/web_theme_classic.scss @@ -90,3 +90,13 @@ div.o_searchview_facet[role="img"] { i.o_searchview_icon[role="img"] { padding-right: 2px; } + +/*********************************************************** + Tree View : Handle style for required fields +************************************************************/ +.o_list_renderer + .o_data_row.o_selected_row + > .o_data_cell.o_required_modifier:not(.o_readonly_modifier) { + /* Disable border bottom as the field has now a background */ + border-bottom: 0px solid; +} From de5dc48531f083d865b818413f2d3c03e9d109e3 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 28 Apr 2023 11:07:14 +0000 Subject: [PATCH 07/32] web_theme_classic 16.0.1.0.2 --- web_theme_classic/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_theme_classic/__manifest__.py b/web_theme_classic/__manifest__.py index afbab3753583..3a7a4a875133 100644 --- a/web_theme_classic/__manifest__.py +++ b/web_theme_classic/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Web Theme Classic", "summary": "Contrasted style on fields to improve the UI.", - "version": "16.0.1.0.1", + "version": "16.0.1.0.2", "author": "GRAP, Odoo Community Association (OCA)", "maintainers": ["legalsylvain"], "website": "https://github.com/OCA/web", From ede4a3ee85132126f8a5b39fc507cd3b32f9c948 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 17:59:06 +0000 Subject: [PATCH 08/32] [UPD] README.rst --- web_theme_classic/README.rst | 15 ++++--- .../static/description/index.html | 40 ++++++++++--------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/web_theme_classic/README.rst b/web_theme_classic/README.rst index c0dd71da4d77..550556072e3d 100644 --- a/web_theme_classic/README.rst +++ b/web_theme_classic/README.rst @@ -2,10 +2,13 @@ Web Theme Classic ================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:080d86ef900f4f27baf1f53f92e407247e033c7b14a46667d53597711605af32 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Web Theme Classic .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_theme_classic :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/162/16.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module extend the Odoo Community Edition ``web`` module to improve visibility of form view. @@ -63,7 +66,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/web_theme_classic/static/description/index.html b/web_theme_classic/static/description/index.html index d70a75674eb8..2a2d0f13afc2 100644 --- a/web_theme_classic/static/description/index.html +++ b/web_theme_classic/static/description/index.html @@ -1,20 +1,20 @@ - + - + Web Theme Classic -
-

Web Theme Classic

+
+ + +Odoo Community Association + +
+

Web Theme Classic

-

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module extend the Odoo Community Edition web module to improve visibility of form view.

Rational: Since Odoo V17, the design is very pure. That’s great, but @@ -399,7 +404,7 @@

Web Theme Classic

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -407,15 +412,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

+
From 252dcd06d87cc60da6887526801413ba671addb4 Mon Sep 17 00:00:00 2001 From: Liam Noonan Date: Tue, 16 Dec 2025 02:59:09 +0300 Subject: [PATCH 25/32] [IMP] web_theme_classic Add ability to toggle theme Now you can either enable by user with Classic Theme Persistent setting, or toggle it on and off like dark mode. It uses a cookie to remember your preference between reloads. --- web_theme_classic/README.rst | 32 ++- web_theme_classic/__init__.py | 1 + web_theme_classic/__manifest__.py | 7 + web_theme_classic/models/__init__.py | 1 + web_theme_classic/models/ir_http.py | 28 +++ web_theme_classic/models/res_users.py | 31 +++ .../models/res_users_settings.py | 12 + web_theme_classic/readme/CONFIGURE.md | 7 + web_theme_classic/readme/DESCRIPTION.md | 8 +- .../static/description/index.html | 59 +++-- .../static/src/js/switch_theme.esm.js | 62 +++++ .../static/src/scss/web_theme_classic.scss | 215 +++++++++--------- web_theme_classic/tests/__init__.py | 1 + web_theme_classic/tests/test_ir_http.py | 91 ++++++++ web_theme_classic/views/res_users_views.xml | 27 +++ 15 files changed, 441 insertions(+), 141 deletions(-) create mode 100644 web_theme_classic/models/__init__.py create mode 100644 web_theme_classic/models/ir_http.py create mode 100644 web_theme_classic/models/res_users.py create mode 100644 web_theme_classic/models/res_users_settings.py create mode 100644 web_theme_classic/readme/CONFIGURE.md create mode 100644 web_theme_classic/static/src/js/switch_theme.esm.js create mode 100644 web_theme_classic/tests/__init__.py create mode 100644 web_theme_classic/tests/test_ir_http.py create mode 100644 web_theme_classic/views/res_users_views.xml diff --git a/web_theme_classic/README.rst b/web_theme_classic/README.rst index fd43959b27c1..e499fb66dfbb 100644 --- a/web_theme_classic/README.rst +++ b/web_theme_classic/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ================= Web Theme Classic ================= @@ -17,7 +13,7 @@ Web Theme Classic .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github @@ -32,15 +28,15 @@ Web Theme Classic |badge1| |badge2| |badge3| |badge4| |badge5| -This module extend the Odoo Community Edition ``web`` module to improve -visibility of form view. +This module extends the Odoo Community Edition ``web`` module to improve +the visibility of input fields. **Rational:** Since Odoo V17, the design is very pure. That's great, but it generates some problem for users : -- Fields are not identifiable. (we can not know exactly where there are +- Fields are not identifiable. (we can not know exactly where they are until you hover over them with the cursor) -- there is no indication for the required fields until trying to save +- There is no indication for the required fields until trying to save (or exit the screen) In a way, this module restores the form display of version 15, but @@ -62,6 +58,24 @@ preserving the "save on the fly" new feature. .. contents:: :local: +Configuration +============= + +This module allows each user to choose whether they would like input +fields to be displayed the "classic" way or the new, standard way (as if +this module were not installed) + +To do this you can either: + +- Check "Classic Theme Persistent" in user preferences. This will enable + the classic theme for that user across all devices. +- Check the "Classic Theme" toggle in the popover menu triggered bu + clicking on the user icon in the navbar. This toggle is only visible + when "Classic Theme Persistent" is disabled. + +Please note that when disabling "Classic Theme Persistent" the style +will not change until the page is reloaded. + Bug Tracker =========== diff --git a/web_theme_classic/__init__.py b/web_theme_classic/__init__.py index e69de29bb2d1..0650744f6bc6 100644 --- a/web_theme_classic/__init__.py +++ b/web_theme_classic/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/web_theme_classic/__manifest__.py b/web_theme_classic/__manifest__.py index 3a44b3e23790..13568120a799 100644 --- a/web_theme_classic/__manifest__.py +++ b/web_theme_classic/__manifest__.py @@ -1,5 +1,6 @@ # Copyright (C) 2022 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# © 2025 Liam Noonan - Pyxiris # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { @@ -14,8 +15,14 @@ "depends": [ "web", ], + "data": [ + "views/res_users_views.xml", + ], "assets": { "web.assets_backend": [ + "web_theme_classic/static/src/js/switch_theme.esm.js", + ], + "web.assets_web": [ "/web_theme_classic/static/src/scss/web_theme_classic.scss", ], "web.assets_web_dark": [ diff --git a/web_theme_classic/models/__init__.py b/web_theme_classic/models/__init__.py new file mode 100644 index 000000000000..604d2da2838e --- /dev/null +++ b/web_theme_classic/models/__init__.py @@ -0,0 +1 @@ +from . import ir_http, res_users, res_users_settings diff --git a/web_theme_classic/models/ir_http.py b/web_theme_classic/models/ir_http.py new file mode 100644 index 000000000000..57c4b72eb901 --- /dev/null +++ b/web_theme_classic/models/ir_http.py @@ -0,0 +1,28 @@ +# © 2022 Florian Kantelberg - initOS GmbH +# © 2025 Liam Noonan - Pyxiris +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models +from odoo.http import request + + +class IrHttp(models.AbstractModel): + _inherit = "ir.http" + + @classmethod + def _set_classic_theme(cls, response): + user = request.env.user + if user and user._is_internal(): + existing_transient_theme = request.httprequest.cookies.get( + "transient_classic_theme_cookie" + ) + persistent_theme = getattr(user, "persistent_classic_theme", None) + # Delete the cookie so that when persistent gets turned off the user + # will not be left wondering why nothing changed + if persistent_theme and existing_transient_theme: + response.delete_cookie("transient_classic_theme_cookie") + + @classmethod + def _post_dispatch(cls, response): + cls._set_classic_theme(response) + return super()._post_dispatch(response) diff --git a/web_theme_classic/models/res_users.py b/web_theme_classic/models/res_users.py new file mode 100644 index 000000000000..f6c4683e4c58 --- /dev/null +++ b/web_theme_classic/models/res_users.py @@ -0,0 +1,31 @@ +# © 2022 Florian Kantelberg - initOS GmbH +# © 2025 Liam Noonan - Pyxiris +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + persistent_classic_theme = fields.Boolean( + related="res_users_settings_id.persistent_classic_theme", + readonly=False, + string="Classic Theme Persistent", + help="This enables Classic Theme on this user's account across all devices. \n " + "Disabling it will will alow you to to use the toggle in the user burger menu " + "in the navbar to enable Classic Mode on a specific session/device \n" + "The toggle is not visible while Persistent Classic Theme is enabled", + ) + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + [ + "persistent_classic_theme", + ] + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + [ + "persistent_classic_theme", + ] diff --git a/web_theme_classic/models/res_users_settings.py b/web_theme_classic/models/res_users_settings.py new file mode 100644 index 000000000000..99b5fe33fdf0 --- /dev/null +++ b/web_theme_classic/models/res_users_settings.py @@ -0,0 +1,12 @@ +# © 2026 Liam Noonan - Pyxiris +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResUsersSettings(models.Model): + _inherit = "res.users.settings" + + # These fields should be here in order to be accessible via in js + # as user.settings.persistent_classic_theme + persistent_classic_theme = fields.Boolean(default=True) diff --git a/web_theme_classic/readme/CONFIGURE.md b/web_theme_classic/readme/CONFIGURE.md new file mode 100644 index 000000000000..2824ab8c8952 --- /dev/null +++ b/web_theme_classic/readme/CONFIGURE.md @@ -0,0 +1,7 @@ +This module allows each user to choose whether they would like input fields to be displayed the "classic" way or the new, standard way (as if this module were not installed) + +To do this you can either: ++ Check "Classic Theme Persistent" in user preferences. This will enable the classic theme for that user across all devices. ++ Check the "Classic Theme" toggle in the popover menu triggered bu clicking on the user icon in the navbar. This toggle is only visible when "Classic Theme Persistent" is disabled. + +Please note that when disabling "Classic Theme Persistent" the style will not change until the page is reloaded. diff --git a/web_theme_classic/readme/DESCRIPTION.md b/web_theme_classic/readme/DESCRIPTION.md index afc3f096e0c9..289a33630b07 100644 --- a/web_theme_classic/readme/DESCRIPTION.md +++ b/web_theme_classic/readme/DESCRIPTION.md @@ -1,12 +1,12 @@ -This module extend the Odoo Community Edition `web` module to improve -visibility of form view. +This module extends the Odoo Community Edition `web` module to improve +the visibility of input fields. **Rational:** Since Odoo V17, the design is very pure. That's great, but it generates some problem for users : - Fields are not identifiable. (we can not know exactly - where there are until you hover over them with the cursor) -- there is no indication for the required fields until trying to save + where they are until you hover over them with the cursor) +- There is no indication for the required fields until trying to save (or exit the screen) In a way, this module restores the form display of version 15, but diff --git a/web_theme_classic/static/description/index.html b/web_theme_classic/static/description/index.html index ecd35f6a0d6a..887dd65fcebe 100644 --- a/web_theme_classic/static/description/index.html +++ b/web_theme_classic/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Web Theme Classic -
+
+

Web Theme Classic

- - -Odoo Community Association - -
-

Web Theme Classic

-

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

-

This module extend the Odoo Community Edition web module to improve -visibility of form view.

+

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

This module extends the Odoo Community Edition web module to improve +the visibility of input fields.

Rational: Since Odoo V17, the design is very pure. That’s great, but it generates some problem for users :

    -
  • Fields are not identifiable. (we can not know exactly where there are +
  • Fields are not identifiable. (we can not know exactly where they are until you hover over them with the cursor)
  • -
  • there is no indication for the required fields until trying to save +
  • There is no indication for the required fields until trying to save (or exit the screen)

In a way, this module restores the form display of version 15, but @@ -394,17 +389,34 @@

Web Theme Classic

Table of contents

+
+

Configuration

+

This module allows each user to choose whether they would like input +fields to be displayed the “classic” way or the new, standard way (as if +this module were not installed)

+

To do this you can either:

+
    +
  • Check “Classic Theme Persistent” in user preferences. This will enable +the classic theme for that user across all devices.
  • +
  • Check the “Classic Theme” toggle in the popover menu triggered bu +clicking on the user icon in the navbar. This toggle is only visible +when “Classic Theme Persistent” is disabled.
  • +
+

Please note that when disabling “Classic Theme Persistent” the style +will not change until the page is reloaded.

+
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -412,15 +424,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-
diff --git a/web_theme_classic/static/src/js/switch_theme.esm.js b/web_theme_classic/static/src/js/switch_theme.esm.js new file mode 100644 index 000000000000..7efb15160017 --- /dev/null +++ b/web_theme_classic/static/src/js/switch_theme.esm.js @@ -0,0 +1,62 @@ +// © 2022 Florian Kantelberg - initOS GmbH +// © 2025 Liam Noonan - Pyxiris +// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import {_t} from "@web/core/l10n/translation"; +import {browser} from "@web/core/browser/browser"; +import {cookie} from "@web/core/browser/cookie"; +import {registry} from "@web/core/registry"; +import {user} from "@web/core/user"; + +/** + * @param {import("@web/env").OdooEnv} env + */ +function classicThemeSwitchItem(env) { + return { + type: "switch", + id: "classic_theme.switch", + description: _t("Classic Theme"), + callback: () => { + env.services.classic_theme.switchTheme(); + }, + isChecked: cookie.get("transient_classic_theme_cookie") === "classic", + sequence: 43, + }; +} + +export const classicThemeService = { + dependencies: ["ui"], + + start(env, {ui}) { + // Apply theme on load + if ( + cookie.get("transient_classic_theme_cookie") === "classic" || + user.settings.persistent_classic_theme + ) { + document.body.classList.add("classic-theme"); + } + + if (!user.settings.persistent_classic_theme) { + registry + .category("user_menuitems") + .add("classic_theme.switch", classicThemeSwitchItem); + } + + return { + async switchTheme() { + const newValue = + cookie.get("transient_classic_theme_cookie") === "classic" + ? "pure" + : "classic"; + cookie.set("transient_classic_theme_cookie", newValue); + document.body.classList.toggle("classic-theme", newValue === "classic"); + + // We do not actually need a reload, but it does get rid of some style glitches + ui.block(); + browser.location.reload(); + }, + }; + }, +}; + +registry.category("services").add("classic_theme", classicThemeService); diff --git a/web_theme_classic/static/src/scss/web_theme_classic.scss b/web_theme_classic/static/src/scss/web_theme_classic.scss index c02f74187178..56b6ee42743c 100644 --- a/web_theme_classic/static/src/scss/web_theme_classic.scss +++ b/web_theme_classic/static/src/scss/web_theme_classic.scss @@ -27,147 +27,154 @@ $wtc-input-color-placeholder-required: #6c757d !default; /*********************************************************** Handle Borders ************************************************************/ - -/* Odoo sets this without consideration for nesting, as occurs with custom properties. +// Only activate these styles when the classic-theme class is set on the body +body.classic-theme { + /* Odoo sets this without consideration for nesting, as occurs with custom properties. * https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/fields.scss#L36C1-L39C2 * We fix that here. We also use our special toned down version of $o-action for full borders */ -.o_field_widget:focus-within { - &:has(.o_field_widget) { - @include print-variable(o-input-border-color, $wtc-input-border-color); - @include print-variable(o-caret-color, $input-color); + .o_field_widget:focus-within { + &:has(.o_field_widget) { + @include print-variable(o-input-border-color, $wtc-input-border-color); + @include print-variable(o-caret-color, $input-color); + } + @include print-variable(o-input-border-color, $wtc-input-border-color-focus); + @include print-variable(o-caret-color, $wtc-input-border-color-focus); } - @include print-variable(o-input-border-color, $wtc-input-border-color-focus); - @include print-variable(o-caret-color, $wtc-input-border-color-focus); -} -// https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/fields.scss#L50C1-L65C2 -.o_input { - border: $input-border-width solid var(--o-input-border-color); - border-radius: 3px; -} + // https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/fields.scss#L50C1-L65C2 + .o_input { + border: $input-border-width solid var(--o-input-border-color); + border-radius: 3px; + } -// An odd case. The search input when adding a new user to an existing task from kanban -// https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.scss#L62C9-L62C55 -.o_m2m_tags_avatar_field_popover .o-autocomplete .o-autocomplete--input.o_input { - border-width: $input-border-width; - padding-left: $o-input-padding-x; -} + // An odd case. The search input when adding a new user to an existing task from kanban + // https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.scss#L62C9-L62C55 + .o_m2m_tags_avatar_field_popover .o-autocomplete .o-autocomplete--input.o_input { + border-width: $input-border-width; + padding-left: $o-input-padding-x; + } -// All these selectors are probably not necessary, but just following: -// https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/properties/properties_field.scss#L12C1-L45C2 -.o_field_properties, -.o_field_properties.o_field_invalid, -.o_property_field_popover { - .o_input:focus, - .dropdown:focus ~ .o_dropdown_button, - .dropdown:focus-within ~ .o_dropdown_button, - .o_input:focus ~ .o_datepicker_button, - .o_dropdown_button:focus { - @include print-variable(o-input-border-color, $wtc-input-border-color-focus); - * { + // All these selectors are probably not necessary, but just following: + // https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/properties/properties_field.scss#L12C1-L45C2 + .o_field_properties, + .o_field_properties.o_field_invalid, + .o_property_field_popover { + .o_input:focus, + .dropdown:focus ~ .o_dropdown_button, + .dropdown:focus-within ~ .o_dropdown_button, + .o_input:focus ~ .o_datepicker_button, + .o_dropdown_button:focus { @include print-variable( o-input-border-color, $wtc-input-border-color-focus ); + * { + @include print-variable( + o-input-border-color, + $wtc-input-border-color-focus + ); + } } } -} -// Give tag type custom properties input borders too. Note the code we are overriding -// https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/properties/property_value.scss#L43C1-L46C2 -.o_field_property_many2many_value:not(.readonly), + // Give tag type custom properties input borders too. Note the code we are overriding + // https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/properties/property_value.scss#L43C1-L46C2 + .o_field_property_many2many_value:not(.readonly), // https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/properties/property_tags.scss#L29C1-L32C2 .o_field_property_tag:not(.readonly) { - border: $input-border-width solid var(--o-input-border-color); - border-radius: 3px; -} - -.o_form_view { - /* Odoo sets borders to transparent unless hovered or focused. We override this. - * https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/form/form_controller.scss#L202C1-L204C6 */ - &:not(.o_field_highlight) - .o_field_widget:not(.o_field_invalid):not(.o_field_highlight) - .o_input:not(:hover):not(:focus) { - --o-input-border-color: #{$wtc-input-border-color}; + border: $input-border-width solid var(--o-input-border-color); + border-radius: 3px; } - /* Monetary fields need some special help */ - .o_field_monetary { - /* Prevent having double border for monetary fields */ - span.o_input:has(~ input.o_input) { - border: $input-border-width solid transparent !important; + .o_form_view { + /* Odoo sets borders to transparent unless hovered or focused. We override this. + * https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/form/form_controller.scss#L202C1-L204C6 */ + &:not(.o_field_highlight) + .o_field_widget:not(.o_field_invalid):not(.o_field_highlight) + .o_input:not(:hover):not(:focus) { + --o-input-border-color: #{$wtc-input-border-color}; } - /* Keep the monetary symbol away from the border when it is outside the border */ - /* For when the symbol is on the left side */ - span.o_input + span.opacity-0 { - margin-right: 3px; - } - /* For when the symbol is on the right side */ - span.o_input ~ span.opacity-0:not(span.o_input + span.opacity-0) { - margin-left: 3px; + /* Monetary fields need some special help */ + .o_field_monetary { + /* Prevent having double border for monetary fields */ + span.o_input:has(~ input.o_input) { + border: $input-border-width solid transparent !important; + } + + /* Keep the monetary symbol away from the border when it is outside the border */ + /* For when the symbol is on the left side */ + span.o_input + span.opacity-0 { + margin-right: 3px; + } + /* For when the symbol is on the right side */ + span.o_input ~ span.opacity-0:not(span.o_input + span.opacity-0) { + margin-left: 3px; + } } } -} -/*********************************************************** + /*********************************************************** Form View : Handle Background for required fields ************************************************************/ -// https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/fields.scss#L31C1-L34C2 -.o_required_modifier { - @include print-variable( - o-input-background-color, - $wtc-input-background-color-required - ); -} + // https://github.com/odoo/odoo/blob/18.0/addons/web/static/src/views/fields/fields.scss#L31C1-L34C2 + .o_required_modifier { + @include print-variable( + o-input-background-color, + $wtc-input-background-color-required + ); + } -/*********************************************************** + /*********************************************************** Tree View : Handle style for input fields ************************************************************/ -// We override all lists, not just in forms -.o_list_renderer .o_data_row { - // Prevent item description from getting $wtc-input-background-color-required when row not in focus - &:not(.selected_row) .o_input { - background-color: initial; - } - &.o_selected_row > .o_data_cell { - &.o_required_modifier:not(.o_readonly_modifier), - &.o_invalid_cell:not(.o_readonly_modifier) { - /* Disable border bottom as the field has now a background */ - border-bottom: 0px; + // We override all lists, not just in forms + .o_list_renderer .o_data_row { + // Prevent item description from getting $wtc-input-background-color-required when row not in focus + &:not(.selected_row) .o_input { + background-color: initial; } - > .o_field_widget { - // We have to manually reintroduce the input invalid styles - &.o_field_invalid:not(.o_readonly_modifier):not(.o_invisible_modifier):has( - .o_input - ) { - --o-input-background-color: #{$o-input-invalid-bg}; - .o_input { - --o-input-border-color: #{$o-danger}; - } + &.o_selected_row > .o_data_cell { + &.o_required_modifier:not(.o_readonly_modifier), + &.o_invalid_cell:not(.o_readonly_modifier) { + /* Disable border bottom as the field has now a background */ + border-bottom: 0px; } - &:not(.o_readonly_modifier):not(.o_invisible_modifier) { - &.o_required_modifier:not(.o_field_invalid) { + > .o_field_widget { + // We have to manually reintroduce the input invalid styles + &.o_field_invalid:not(.o_readonly_modifier):not( + .o_invisible_modifier + ):has(.o_input) { + --o-input-background-color: #{$o-input-invalid-bg}; .o_input { - color: $wtc-input-color-required; - --o-input-background-color: #{$wtc-input-background-color-required} !important; - background-color: var(--o-input-background-color) !important; + --o-input-border-color: #{$o-danger}; } } - // Handle borders - .o_input { - border: $input-border-width solid var(--o-input-border-color) !important; - /* Prevent double borders in nested o_input like tags */ + &:not(.o_readonly_modifier):not(.o_invisible_modifier) { + &.o_required_modifier:not(.o_field_invalid) { + .o_input { + color: $wtc-input-color-required; + --o-input-background-color: #{$wtc-input-background-color-required} !important; + background-color: var( + --o-input-background-color + ) !important; + } + } + // Handle borders .o_input { - border: 0 !important; + border: $input-border-width solid var(--o-input-border-color) !important; + /* Prevent double borders in nested o_input like tags */ + .o_input { + border: 0 !important; + } } } - } - // Handle monetary fields in list - &.o_field_monetary span.o_input:has(~ input.o_input) { - border: $input-border-width solid transparent !important; + // Handle monetary fields in list + &.o_field_monetary span.o_input:has(~ input.o_input) { + border: $input-border-width solid transparent !important; + } } } } diff --git a/web_theme_classic/tests/__init__.py b/web_theme_classic/tests/__init__.py new file mode 100644 index 000000000000..e2983aa2a489 --- /dev/null +++ b/web_theme_classic/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ir_http diff --git a/web_theme_classic/tests/test_ir_http.py b/web_theme_classic/tests/test_ir_http.py new file mode 100644 index 000000000000..3b8db3adc904 --- /dev/null +++ b/web_theme_classic/tests/test_ir_http.py @@ -0,0 +1,91 @@ +# © 2022 Florian Kantelberg - initOS GmbH +# © 2026 Liam Noonan - Pyxiris +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests import HttpCase, new_test_user, tagged + +HOST = "127.0.0.1" + + +@tagged("post_install", "-at_install") +class TestClassicTheme(HttpCase): + def setUp(self): + super().setUp() + self.test_portal_user = new_test_user( + self.env, "test_portal_user", groups="base.group_portal" + ) + # new_test_user() does not create a res_users_settings table for portal users + # for some reason, even though in an actual db this exists. We forcibly make + # it here so we can test that our logic does not run for portal users + self.env["res.users.settings"].create( + {"user_id": self.test_portal_user.id, "persistent_classic_theme": True} + ) + + self.test_internal_user = new_test_user( + self.env, "test_internal_user", groups="base.group_user" + ) + self.test_internal_user.write({"persistent_classic_theme": False}) + + # Non internal user -> skip logic, do nothing + def test_01_non_internal_user_ignored(self): + self.authenticate(self.test_portal_user.login, self.test_portal_user.login) + self.opener.cookies.set( + "transient_classic_theme_cookie", "pure", domain=HOST, path="/" + ) + response = self.url_open("/my") + cookie_header = response.headers.get("Set-Cookie", "") + self.assertNotIn( + "transient_classic_theme_cookie", + cookie_header, + "We should have skipped over this due to being an external user", + ) + + # Persistent theme not set, no cookie -> do nothing + def test_02_persistent_theme_not_set_no_cookie(self): + self.authenticate(self.test_internal_user.login, self.test_internal_user.login) + response = self.url_open("/odoo") + cookie_header = response.headers.get("Set-Cookie", "") + self.assertNotIn( + "transient_classic_theme_cookie", + cookie_header, + "Persistent is not set and there was no cookie, " + "so we should not be deleting the cookie", + ) + + # Persistent theme not set, cookie exists -> do nothing + def test_03_persistent_theme_not_set_cookie_exists(self): + self.authenticate(self.test_internal_user.login, self.test_internal_user.login) + self.opener.cookies.set( + "transient_classic_theme_cookie", "classic", domain=HOST, path="/" + ) + response = self.url_open("/odoo") + cookie_header = response.headers.get("Set-Cookie", "") + self.assertNotIn( + "transient_classic_theme_cookie", + cookie_header, + "Persistent is not set, so we should not be deleting the cookie", + ) + + # Persistent theme set, no cookie -> do nothing + def test_04_persistent_theme_set_no_cookie(self): + self.test_internal_user.write({"persistent_classic_theme": True}) + self.authenticate(self.test_internal_user.login, self.test_internal_user.login) + response = self.url_open("/odoo") + cookie_header = response.headers.get("Set-Cookie", "") + self.assertNotIn( + "transient_classic_theme_cookie", + cookie_header, + "Persistent is set but there was no cookie, " + "so we should not be deleting the cookie", + ) + + # Persistent theme set, cookie exists -> delete cookie + def test_05_persistent_theme_set_cookie_exists(self): + self.test_internal_user.write({"persistent_classic_theme": True}) + self.authenticate(self.test_internal_user.login, self.test_internal_user.login) + self.opener.cookies.set( + "transient_classic_theme_cookie", "classic", domain=HOST, path="/" + ) + response = self.url_open("/odoo") + cookie_header = response.headers.get("Set-Cookie", "") + self.assertIn("transient_classic_theme_cookie", cookie_header) diff --git a/web_theme_classic/views/res_users_views.xml b/web_theme_classic/views/res_users_views.xml new file mode 100644 index 000000000000..017481b2bef3 --- /dev/null +++ b/web_theme_classic/views/res_users_views.xml @@ -0,0 +1,27 @@ + + + + res.users + + + + + + + + + + + + res.users.form.web_theme_classic + res.users + + + + + + + + + + From b8086fc8ce5592308d59304eedcb7bbc3333d725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bet=C3=BCl=20=C3=96=C4=9Fmen?= Date: Wed, 25 Feb 2026 11:13:10 +0000 Subject: [PATCH 26/32] Added translation using Weblate (Turkish) --- web_theme_classic/i18n/tr.po | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 web_theme_classic/i18n/tr.po diff --git a/web_theme_classic/i18n/tr.po b/web_theme_classic/i18n/tr.po new file mode 100644 index 000000000000..ebd417b4f9d9 --- /dev/null +++ b/web_theme_classic/i18n/tr.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" From 2558faa5e3555aeb1bd04a54126a5029878fff16 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 28 Apr 2026 07:13:45 +0000 Subject: [PATCH 27/32] [UPD] Update web_theme_classic.pot --- web_theme_classic/i18n/web_theme_classic.pot | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/web_theme_classic/i18n/web_theme_classic.pot b/web_theme_classic/i18n/web_theme_classic.pot index aadee09bfeda..ea3c52ebf70f 100644 --- a/web_theme_classic/i18n/web_theme_classic.pot +++ b/web_theme_classic/i18n/web_theme_classic.pot @@ -1,5 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: +# * web_theme_classic # msgid "" msgstr "" @@ -11,3 +12,42 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" + +#. module: web_theme_classic +#. odoo-javascript +#: code:addons/web_theme_classic/static/src/js/switch_theme.esm.js:0 +msgid "Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users__persistent_classic_theme +msgid "Classic Theme Persistent" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_ir_http +msgid "HTTP Routing" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users_settings__persistent_classic_theme +msgid "Persistent Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,help:web_theme_classic.field_res_users__persistent_classic_theme +msgid "" +"This enables Classic Theme on this user's account across all devices. \n" +" Disabling it will will alow you to to use the toggle in the user burger menu in the navbar to enable Classic Mode on a specific session/device \n" +"The toggle is not visible while Persistent Classic Theme is enabled" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users +msgid "User" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users_settings +msgid "User Settings" +msgstr "" From 6fae604071b29c39777240cf822afb89facf9143 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 28 Apr 2026 07:21:23 +0000 Subject: [PATCH 28/32] [BOT] post-merge updates --- web_theme_classic/README.rst | 8 ++++-- web_theme_classic/__manifest__.py | 2 +- .../static/description/index.html | 28 +++++++++++-------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/web_theme_classic/README.rst b/web_theme_classic/README.rst index e499fb66dfbb..5825ab46e06f 100644 --- a/web_theme_classic/README.rst +++ b/web_theme_classic/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ================= Web Theme Classic ================= @@ -7,13 +11,13 @@ Web Theme Classic !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:27279023c56e7554295aea7c8e94ddad0c3cf9962ba5f11a6de4b8c1766e9e59 + !! source digest: sha256:96a272ee896986cd77dc37d08d7df63ad97290bbe73d90c2ac25139644f4ae70 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github diff --git a/web_theme_classic/__manifest__.py b/web_theme_classic/__manifest__.py index 13568120a799..9d189e05517b 100644 --- a/web_theme_classic/__manifest__.py +++ b/web_theme_classic/__manifest__.py @@ -6,7 +6,7 @@ { "name": "Web Theme Classic", "summary": "Contrasted style on fields to improve the UI.", - "version": "18.0.1.1.0", + "version": "18.0.1.2.0", "author": "GRAP, Odoo Community Association (OCA)", "maintainers": ["legalsylvain"], "website": "https://github.com/OCA/web", diff --git a/web_theme_classic/static/description/index.html b/web_theme_classic/static/description/index.html index 887dd65fcebe..190aa5109dc1 100644 --- a/web_theme_classic/static/description/index.html +++ b/web_theme_classic/static/description/index.html @@ -3,7 +3,7 @@ -Web Theme Classic +README.rst -
-

Web Theme Classic

+
+ + +Odoo Community Association + +
+

Web Theme Classic

-

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module extends the Odoo Community Edition web module to improve the visibility of input fields.

Rational: Since Odoo V17, the design is very pure. That’s great, but @@ -400,7 +405,7 @@

Web Theme Classic

-

Configuration

+

Configuration

This module allows each user to choose whether they would like input fields to be displayed the “classic” way or the new, standard way (as if this module were not installed)

@@ -416,7 +421,7 @@

Configuration

will not change until the page is reloaded.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -424,15 +429,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

+
From 5adf8ed6d15c0c5bdda1e85b0c67870eef7cee40 Mon Sep 17 00:00:00 2001 From: Weblate Date: Tue, 28 Apr 2026 07:21:33 +0000 Subject: [PATCH 29/32] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: web-18.0/web-18.0-web_theme_classic Translate-URL: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_theme_classic/ --- web_theme_classic/i18n/it.po | 40 ++++++++++++++++++++++++++++++++++++ web_theme_classic/i18n/tr.po | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/web_theme_classic/i18n/it.po b/web_theme_classic/i18n/it.po index 8af45f7b8781..ec4b00c38cfc 100644 --- a/web_theme_classic/i18n/it.po +++ b/web_theme_classic/i18n/it.po @@ -12,3 +12,43 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: web_theme_classic +#. odoo-javascript +#: code:addons/web_theme_classic/static/src/js/switch_theme.esm.js:0 +msgid "Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users__persistent_classic_theme +msgid "Classic Theme Persistent" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_ir_http +msgid "HTTP Routing" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users_settings__persistent_classic_theme +msgid "Persistent Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,help:web_theme_classic.field_res_users__persistent_classic_theme +msgid "" +"This enables Classic Theme on this user's account across all devices. \n" +" Disabling it will will alow you to to use the toggle in the user burger " +"menu in the navbar to enable Classic Mode on a specific session/device \n" +"The toggle is not visible while Persistent Classic Theme is enabled" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users +msgid "User" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users_settings +msgid "User Settings" +msgstr "" diff --git a/web_theme_classic/i18n/tr.po b/web_theme_classic/i18n/tr.po index ebd417b4f9d9..d14f93f284ac 100644 --- a/web_theme_classic/i18n/tr.po +++ b/web_theme_classic/i18n/tr.po @@ -12,3 +12,43 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: web_theme_classic +#. odoo-javascript +#: code:addons/web_theme_classic/static/src/js/switch_theme.esm.js:0 +msgid "Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users__persistent_classic_theme +msgid "Classic Theme Persistent" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_ir_http +msgid "HTTP Routing" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users_settings__persistent_classic_theme +msgid "Persistent Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,help:web_theme_classic.field_res_users__persistent_classic_theme +msgid "" +"This enables Classic Theme on this user's account across all devices. \n" +" Disabling it will will alow you to to use the toggle in the user burger " +"menu in the navbar to enable Classic Mode on a specific session/device \n" +"The toggle is not visible while Persistent Classic Theme is enabled" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users +msgid "User" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users_settings +msgid "User Settings" +msgstr "" From 9cd5aba3ad9e5589ec00c8215bc1fc3b8090a030 Mon Sep 17 00:00:00 2001 From: mymage Date: Thu, 30 Apr 2026 08:18:59 +0000 Subject: [PATCH 30/32] Translated using Weblate (Italian) Currently translated at 100.0% (7 of 7 strings) Translation: web-18.0/web-18.0-web_theme_classic Translate-URL: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_theme_classic/it/ --- web_theme_classic/i18n/it.po | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/web_theme_classic/i18n/it.po b/web_theme_classic/i18n/it.po index ec4b00c38cfc..17739385a8f7 100644 --- a/web_theme_classic/i18n/it.po +++ b/web_theme_classic/i18n/it.po @@ -5,34 +5,36 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-04-30 09:36+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: web_theme_classic #. odoo-javascript #: code:addons/web_theme_classic/static/src/js/switch_theme.esm.js:0 msgid "Classic Theme" -msgstr "" +msgstr "Tema classico" #. module: web_theme_classic #: model:ir.model.fields,field_description:web_theme_classic.field_res_users__persistent_classic_theme msgid "Classic Theme Persistent" -msgstr "" +msgstr "Tema classico persistente" #. module: web_theme_classic #: model:ir.model,name:web_theme_classic.model_ir_http msgid "HTTP Routing" -msgstr "" +msgstr "Instradamento HTTP" #. module: web_theme_classic #: model:ir.model.fields,field_description:web_theme_classic.field_res_users_settings__persistent_classic_theme msgid "Persistent Classic Theme" -msgstr "" +msgstr "Tema classico persistente" #. module: web_theme_classic #: model:ir.model.fields,help:web_theme_classic.field_res_users__persistent_classic_theme @@ -42,13 +44,19 @@ msgid "" "menu in the navbar to enable Classic Mode on a specific session/device \n" "The toggle is not visible while Persistent Classic Theme is enabled" msgstr "" +"Questa opzione abilita il tema classico sull'account di questo utente su " +"tutti i dispositivi.\n" +"Disabilitandola, si potrà utilizzare l'interruttore nel pulsante menu " +"dell'utente nella barra di navigazione per abilitare la modalità classica su " +"una sessione/dispositivo specifici.\n" +"L'interruttore non è visibile quando il tema classico persistente è abilitato" #. module: web_theme_classic #: model:ir.model,name:web_theme_classic.model_res_users msgid "User" -msgstr "" +msgstr "Utente" #. module: web_theme_classic #: model:ir.model,name:web_theme_classic.model_res_users_settings msgid "User Settings" -msgstr "" +msgstr "Impostazioni utente" From cca931b78aeda9a350ee8b208b8e346e39c3340a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarmo=20Kortetj=C3=A4rvi?= Date: Tue, 12 May 2026 13:55:25 +0000 Subject: [PATCH 31/32] Added translation using Weblate (Finnish) --- web_theme_classic/i18n/fi.po | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 web_theme_classic/i18n/fi.po diff --git a/web_theme_classic/i18n/fi.po b/web_theme_classic/i18n/fi.po new file mode 100644 index 000000000000..99d54022d8be --- /dev/null +++ b/web_theme_classic/i18n/fi.po @@ -0,0 +1,54 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_theme_classic +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: web_theme_classic +#. odoo-javascript +#: code:addons/web_theme_classic/static/src/js/switch_theme.esm.js:0 +msgid "Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users__persistent_classic_theme +msgid "Classic Theme Persistent" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_ir_http +msgid "HTTP Routing" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,field_description:web_theme_classic.field_res_users_settings__persistent_classic_theme +msgid "Persistent Classic Theme" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model.fields,help:web_theme_classic.field_res_users__persistent_classic_theme +msgid "" +"This enables Classic Theme on this user's account across all devices. \n" +" Disabling it will will alow you to to use the toggle in the user burger menu in the navbar to enable Classic Mode on a specific session/device \n" +"The toggle is not visible while Persistent Classic Theme is enabled" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users +msgid "User" +msgstr "" + +#. module: web_theme_classic +#: model:ir.model,name:web_theme_classic.model_res_users_settings +msgid "User Settings" +msgstr "" From 8c0f6c9ec805a4abf81de101af89615bca555dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarmo=20Kortetj=C3=A4rvi?= Date: Tue, 12 May 2026 17:10:56 +0300 Subject: [PATCH 32/32] [MIG] web_theme_classic: Migration to 19.0 --- web_theme_classic/__manifest__.py | 2 +- web_theme_classic/views/res_users_views.xml | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/web_theme_classic/__manifest__.py b/web_theme_classic/__manifest__.py index 9d189e05517b..02121e422743 100644 --- a/web_theme_classic/__manifest__.py +++ b/web_theme_classic/__manifest__.py @@ -6,7 +6,7 @@ { "name": "Web Theme Classic", "summary": "Contrasted style on fields to improve the UI.", - "version": "18.0.1.2.0", + "version": "19.0.1.0.0", "author": "GRAP, Odoo Community Association (OCA)", "maintainers": ["legalsylvain"], "website": "https://github.com/OCA/web", diff --git a/web_theme_classic/views/res_users_views.xml b/web_theme_classic/views/res_users_views.xml index 017481b2bef3..e9f87f28c557 100644 --- a/web_theme_classic/views/res_users_views.xml +++ b/web_theme_classic/views/res_users_views.xml @@ -4,11 +4,11 @@ res.users - + - + @@ -17,11 +17,9 @@ res.users - - - - - + + +
+

Web Theme Classic

+ + +

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runbot

+

This module extend the Odoo Community Edition web module to improve visibility +of form view.

+

Rational: +In Odoo V16, the design is very pure. That’s great, but it generates some problem for +users :

+
    +
  • buttons and fields are not identifiable. (we can not know exactly where there are +until you hover over them with the cursor)
  • +
  • there is no indication for the required fields until trying to save (or exit the screen)
  • +
+

In a way, this module restores the form display of version 15, but preserving the “save on the fly” new feature.

+

Without this module

+
+https://raw.githubusercontent.com/OCA/web/16.0/web_theme_classic/static/description/product_template_form_without_module.png +
+

With this module

+
+https://raw.githubusercontent.com/OCA/web/16.0/web_theme_classic/static/description/product_template_form_with_module.png +
+

Table of contents

+ +
+

Known issues / Roadmap

+
    +
  • For the time being, the module improves form and search view. Some other improvement could +be done on other part of the UI.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • GRAP
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

legalsylvain

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+