From c5a0abc51c74791d54038943883796d0177ece55 Mon Sep 17 00:00:00 2001 From: Gareth Barnard <1058419+gjb2048@users.noreply.github.com> Date: Sun, 16 Jun 2024 21:44:54 +0100 Subject: [PATCH] V404.1.0 --- Changes.md | 24 ++ Support.md => SupportAndSponsorship.md | 0 classes/output/core_renderer_layout.php | 5 + classes/output/core_renderer_toolbox.php | 268 ++++++++++++++++-- classes/toolbox.php | 20 +- config.php | 1 + lang/en/theme_adaptable.php | 35 ++- pix/layout-builder/12-0-0-0.png | Bin 1357 -> 4163 bytes pix/layout-builder/12-0-0-0.svg | 56 ++++ pix/layout-builder/3-3-3-3.png | Bin 1954 -> 6972 bytes pix/layout-builder/3-3-3-3.svg | 86 ++++++ pix/layout-builder/3-3-6-0.png | Bin 1909 -> 3477 bytes pix/layout-builder/3-3-6-0.svg | 76 +++++ pix/layout-builder/3-6-3-0.png | Bin 1896 -> 4685 bytes pix/layout-builder/3-6-3-0.svg | 76 +++++ pix/layout-builder/3-9-0-0.png | Bin 1771 -> 9536 bytes pix/layout-builder/3-9-0-0.svg | 68 +++++ pix/layout-builder/4-4-4-0.png | Bin 1853 -> 4884 bytes pix/layout-builder/4-4-4-0.svg | 79 ++++++ pix/layout-builder/4-8-0-0.png | Bin 1894 -> 9185 bytes pix/layout-builder/4-8-0-0.svg | 68 +++++ pix/layout-builder/5-7-0-0.png | Bin 6920 -> 5169 bytes pix/layout-builder/5-7-0-0.svg | 66 +++++ pix/layout-builder/6-3-3-0.png | Bin 1907 -> 3521 bytes pix/layout-builder/6-3-3-0.svg | 79 ++++++ pix/layout-builder/6-6-0-0.png | Bin 1644 -> 2285 bytes pix/layout-builder/6-6-0-0.svg | 68 +++++ pix/layout-builder/7-5-0-0.png | Bin 7060 -> 5122 bytes pix/layout-builder/7-5-0-0.svg | 68 +++++ pix/layout-builder/8-4-0-0.png | Bin 1813 -> 9118 bytes pix/layout-builder/8-4-0-0.svg | 66 +++++ pix/layout-builder/9-3-0-0.png | Bin 1708 -> 8010 bytes pix/layout-builder/9-3-0-0.svg | 66 +++++ scss/settings/adaptable.scss | 37 ++- scss/settings/blocks.scss | 43 ++- settings.php | 3 +- settings/array_definitions.php | 1 + settings/information.php | 10 +- settings/information_blocks.php | 81 ++++++ .../core_message/message_drawer.mustache | 4 +- templates/tool_usertours/tourstep.mustache | 2 +- version.php | 6 +- 42 files changed, 1390 insertions(+), 72 deletions(-) rename Support.md => SupportAndSponsorship.md (100%) create mode 100644 pix/layout-builder/12-0-0-0.svg create mode 100644 pix/layout-builder/3-3-3-3.svg create mode 100644 pix/layout-builder/3-3-6-0.svg create mode 100644 pix/layout-builder/3-6-3-0.svg create mode 100644 pix/layout-builder/3-9-0-0.svg create mode 100644 pix/layout-builder/4-4-4-0.svg create mode 100644 pix/layout-builder/4-8-0-0.svg create mode 100644 pix/layout-builder/5-7-0-0.svg create mode 100644 pix/layout-builder/6-3-3-0.svg create mode 100644 pix/layout-builder/6-6-0-0.svg create mode 100644 pix/layout-builder/7-5-0-0.svg create mode 100644 pix/layout-builder/8-4-0-0.svg create mode 100644 pix/layout-builder/9-3-0-0.svg create mode 100644 settings/information_blocks.php diff --git a/Changes.md b/Changes.md index f92ef32..1b1743a 100644 --- a/Changes.md +++ b/Changes.md @@ -1,3 +1,27 @@ +Change Log in version 404.1.0 (2024032802) - In development. +============================================================ +1. Fix header information overridden when set in the context header leading to missing output. +2. Add 'Information blocks'. This is designed to be a replacement for the marketing blocks that are + now deprecated. The code that they use has always been problematic and subject to contained file + based content being lost on occasion, or rather not lost but misplaced in terms of linkage at times. + I've never been able to entirely rectify or resolve the issues. Therefore instead of reinventing the + wheel, I've gone for a block region based solution whereby proven and tested block code is employed. + Instead of defining the content in the theme settings, you'll create blocks and place them in the + 'information' region on the front page. Of course you'll find all of the other settings in place + to control the layout and visiblity as before, on the theme's 'Information blocks' settings tab. + When editing you'll see the full block header with each block having the same width to allow easy + manipulation, i.e. the layout you set is not applied. Its only when editing is off that the layout + is applied and the block titles removed. If you see the word 'Overflow' then that means that you have + more blocks than you've defined in the layout rows to allow. Admins will see 'Marketing blocks are + deprecated, please migrate to using the Information block region.'. When editing, block regions will + have their name at the top. In testing with re-ordering the blocks I did find this problematic and + could not work out entiry why as the theme code is doing what it should do, the core code is telling + the backend via an AJAX call about the reordering, just that after doing so then it seemed that cron + had to run for the changes to become permanent. It is my intention that other settings employing the + same code as the marketing blocks will also migrate to this improved solution. +3. Improve the look of the calendar block controls and fix the next and previous icons. +4. Improve the layout builder to have new clearer responsive images. + Change Log in version 404.0.2 (2024032801) =========================================== 1. Reduce drawer flicker on page load when the navbar is sticky. diff --git a/Support.md b/SupportAndSponsorship.md similarity index 100% rename from Support.md rename to SupportAndSponsorship.md diff --git a/classes/output/core_renderer_layout.php b/classes/output/core_renderer_layout.php index 543c215..1d1fb46 100644 --- a/classes/output/core_renderer_layout.php +++ b/classes/output/core_renderer_layout.php @@ -1202,6 +1202,11 @@ public function frontpage_layout() { echo ''; } + // If Information Blocks are enabled then let's show them. + if (!empty($themesettings->informationblocksenabled)) { + echo $this->get_flexible_blocks('information'); + } + // If Marketing Blocks are enabled then let's show them. if (!empty($themesettings->frontpagemarketenabled)) { echo $this->get_marketing_blocks(); diff --git a/classes/output/core_renderer_toolbox.php b/classes/output/core_renderer_toolbox.php index 6d4a827..9b1b616 100644 --- a/classes/output/core_renderer_toolbox.php +++ b/classes/output/core_renderer_toolbox.php @@ -485,19 +485,21 @@ public function block(block_contents $bc, $region) { $bc->add_class('mb-3'); if (empty($skiptitle)) { - $output = ''; - $skipdest = ''; - } else { - $output = html_writer::link( - '#sb-' . $bc->skipid, - get_string('skipa', 'access', $skiptitle), - ['class' => 'skip skip-block', 'id' => 'fsb-' . $bc->skipid] - ); - $skipdest = html_writer::span( - '', - 'skip-block-to', - ['id' => 'sb-' . $bc->skipid] - ); + $skiptitle = get_string('skipblock', 'theme_adaptable', $bc->blockinstanceid); + } + $output = html_writer::link( + '#sb-' . $bc->skipid, + get_string('skipa', 'access', $skiptitle), + ['class' => 'skip skip-block', 'id' => 'fsb-' . $bc->skipid] + ); + $skipdest = html_writer::span( + '', + 'skip-block-to', + ['id' => 'sb-' . $bc->skipid] + ); + + if (!empty($bc->attributes['notitle'])) { + $bc->title = ''; } $output .= html_writer::start_tag('section', $bc->attributes); @@ -1045,16 +1047,185 @@ public function get_missing_block_regions($blocksarray, $classes = [], $displaya } /** - * Renders marketing blocks on front page + * Get the HTML for block title in the given region. + * + * @param string $region The region to get HTML for. + * + * @return string HTML. + */ + protected function block_region_title($region) { + return html_writer::tag( + 'p', + get_string('region-' . $region, 'theme_adaptable'), + ['class' => 'block-region-title col-12 text-center font-italic font-weight-bold'] + ); + } + + /** + * Renders flexible blocks on front page. + * + * @param string $region + * @param string $layoutrow + * @param string $settingname + * @param array $classes + * @param string $tag + * @return string Markup. + */ + public function get_flexible_blocks( + $region, + $layoutrow = 'informationblockslayoutrow', + $settingname = 'information', + $classes = [], + $tag = 'aside') { + $editing = $this->page->user_is_editing(); + $themesettings = \theme_adaptable\toolbox::get_settings(); + + if (!$editing) { + $visiblestate = 3; + if (!empty($themesettings->informationblocksvisible)) { + $visiblestate = $themesettings->informationblocksvisible; + } + if ($visiblestate != 3) { + $loggedin = isloggedin(); + if ((($visiblestate == 1) && ($loggedin)) || (($visiblestate == 2) && (!$loggedin))) { + return ''; + } + } + } + + $content = ''; + $classes = (array)$classes; + $classes[] = 'block-region'; + + if ($editing) { + $content .= $this->block_region_title($region); + $classes[] = 'editing-flexible-blocks'; + } + + $attributes = [ + 'id' => 'block-region-' . $region, + 'class' => join(' ', $classes), + 'data-blockregion' => $region, + 'data-droptarget' => '1', + ]; + + if ($this->page->blocks->region_has_content($region, $this)) { + $content .= html_writer::tag('h2', get_string('blocks'), ['class' => 'sr-only']); + + $blockcontents = $this->page->blocks->get_content_for_region($region, $this); + $lastblock = null; + $zones = []; + foreach ($blockcontents as $bc) { + if ($bc instanceof block_contents) { + $zones[] = $bc->title; + } + } + + if (!$editing) { + $blockrows = []; + $blocksequence = []; + $blocksequencecount = 0; + $blockspacescount = 0; + + $content .= '
rbAO zmGXgZ56bcD#3VxQ3s+D{`HEYNH^akAFSosF$&ZAQipiG`ptTRJ&TzkgH74rn?!L43 zX~TXFhvmV-JzblXnw*otv`WfTFAH%W=hb{#C@ocI~)XMCrM{TUQ0JOeR~IpstN| zP-{1%)xDi@j)zocRsu8SWr+tKr@@B!+cy3qktTqBMU9#f&!Qa7tS{>~pNwJ>$&}#7 z0y4f!F3%mqhJ`gJyLq@ZHZ>KgH0oCEn;t=V)7j9lGo7m1=WjKa6_LTSM&G?^D`pbc zJkf7jh2n`9p&g@25s^K7&l-^s3Vd>NCTd7F>x?g{f{rU6sTqjF&nJ*ny>7?P{{jW) Bhs*!~ diff --git a/pix/layout-builder/3-3-3-3.svg b/pix/layout-builder/3-3-3-3.svg new file mode 100644 index 0000000..94f26be --- /dev/null +++ b/pix/layout-builder/3-3-3-3.svg @@ -0,0 +1,86 @@ + + + + diff --git a/pix/layout-builder/3-3-6-0.png b/pix/layout-builder/3-3-6-0.png index b3bd1fa4fcdab38d5a573bc4703721bfae8b5910..889bea101f3afea7f5801ae70381426be0ff6c01 100644 GIT binary patch literal 3477 zcmY*b3p~?nAOFiKr?-puoJ3Tdb1YLy7YZSDD)}F=+;1`ER*{uUV>8z2bUFyNg@mo7 z6m5!1tZgb0avd$PP428VWwWuF_y3=IKkxhfe6~INJ-_F9e)r!m^@!`C75_5$7XSb& zK&J!l0H8&L*86^30)20LRP6`-EIs4o7YhI@U%?-Z2F$%sh^QZT&^OKl6CQ^>783?w zu~_qy(UGws$IgVAV`3umMRo?zjlY2h_IV~0eC9P{3b4$EFKrgAp@B_LTsYSXLOWjm zs#oRo&kBuV9jfmAX7hjle89{3R3-6uJio8g;Mc&0=f(N@QfQ(-rp@_y5vqKZz@G z(fP3M=s;?r<=J}5s7<=*>v*T$_pVfZnUv(%WD&zxZOYWM5ai9QM%hap^52!SkAz-K z{z}#g*F~dTSz|wJs_L^C^eO-O}{ypx639`$wW{C z67SDvrl#6+%DCMe7-ej(fcOhjnku6# E> zfko2rABsVh0rjwPW110FCPVvw@OAS+!6;vaqj_hkZAIZDyBM9dJG1O}#o{ada*XD) zaa2c48^ylLD!;`Guj`0HiR)PkUJ9Gp6J?&H^qC+W71yQ8q628=Mwo`oTLf@AkioBv zaL!zBd)o&sR)DOO&$B`_m&0LPWQsS;@Sh0F38$fLMLvHA^ss)jpml2OHafYyCo1_2 zGns(eZdIkElGXAAAtm+oj(7L;3Ac=l LtIEdJFP@30F9Na*THK&>{cNMx+JXEPMy)Nun9F>keo7 zZ*6| BFgp2pW2L-~JsnrB>FKmX@)+Me^G7ThX!>pq~@0p=|U8G}||t5q-Fw ziznssue!BR5+{YPSh-?FO9Emk5O}xa1p7!%#+O3dORVa6VXg80{lW>ur4ScDys>VN zGRB{F?!)I(n?M}-)N|9c<8g7lFNXG0Czb+nH<483yGSr7pF%NDFG?sDCBmnGdniWW zT^^lO>;U4BCL#wCq9uGPxbT98dKY-OBcn!ZVF?7sTWhWXYTjD3DW}(l^(07IZLL1N zf1bGiY4rLx^uYb`S&L!Ly;@_11$N2Xz>v_;XHKM!j?-sXZUf@zr4v1Qo>?fDz}Bv= zVNb6xjpb@?QkfVqbapSWvnd>!ShQy0Euv^}dGNR8&X?b*!5L#TJWTxs+(9lbVY4GV zNJXY;HKUNQH<$SVngH<7j6ld(u3g^z@^`7~Q o=wiWL>y$LHnJ(HuPw)#`3*d ziSmzl65^m+68_AYNlzw6E#qF 7G@_8IJK^Qjv}*uDy@!2Htk#-`eYU=OOfs1cg$eeH3K%{t?LO zdmF4%RDU#8G^MWcK;wq9S7`=3jlvO Msjc zD+3VCyEz_+jTHpNWVWW3VNK^f{4WbTfcK@v+ZL9!1|N-YYTRtLH2AF7RI!~EJKAnl z6}>(o^u&okp0WCYBji_?(5_|Ou8csJ4IsunL+_y5<;-Z?>&2#NH;_L7dpgOeWZ@G; zxeE%Fd(h3!U1q1gyQ_p}&WZK`JE;ifs#P*0kQ82-_^|cGHyM2OBVb3vc<@szu!Lwn z_11zt=jgY~kU7=5!gd#ie}xvHRT0TO!V6Ig(yoC+BD0JRcdpUbHz$S0#RU{-E(Z$B zN^$2*x(7WxaxHeo+jx1Y;|Bn)3{BV)8%R1xlq<5j2KFnAn+iDg)d Hh%R=Sn==()4{fPH{<}GMSLaHl4J<5vd1nr z^x4Q+=!P+Oh&}G|ix(=1bah_dNoGg1&lHF*6XgNKwG1IWqo)dUD6L37*x%oOA-)Z^ z09-8g879jq2+&POV7P9botM}WmIi1iK+cDR);tU~)Q#1BYmC@crfJ1&HZoHKQm8-t zTdpiy78V{6kVoCBMIlVrIo);(Od3e-;Ka9eGe`KYX&?7ray0?#8?X^`IPG5O!e=&y z;G*{JtyDIt;z7(nT~}^U;&5GU&X)WjBcu6=BwnlrF#n;aGB-vt764WtPd@j|vB|0P ztA%7bVhjb??s_OvM_*p_CMiu$4t?rbhDF+Vi9KPNf%a;sX^=b JJxRm0=P%JMCk%g7p8$y6#}=vxl=zPFA5Q>dJ2D&<7b~JJi~DROEl?O3 z>Kpj`$eh&dT|<)}b2+D;K*8k!cIJBy9(2>WeY gEoSihH6AAH;sk1i-sqzji?!Ao4E@B9s(%Q*SYB zx15Ya;^(oiGF$SkLWS?nfBLY~Q|7B?j3e?J8wa(>mX3~prz7;&^K?f6&Ap?grIbQY zDu=4$VV6KxFE4fc005$Tc4hw~#Op>f2c( z;${{2T^k_f?&0Aet+}F3-sVm&_s!&FjhUIJxUKc6E93y#VO|t8OWA{+QM=kU=+hI| z!R*%{_VpoW9y$;R2gAetF^_w@lRCMjcoU$%UQ`nqGX1&tYLThR+S*zk%$tH=ha>pP zB_kFRbk})ZrKP2X>b6}0Zvb&d>gqBEkjY!4|1h_zZxC-u`wdE%)DT#qXMSp3&7i8C z*VE%YGTMATf@;6L^Mt1!HQ~4 ILz6JnSwop?FyNAwx2aK zv%_J2rnxzKS}Gl*jRzS+WK}=z*sZr$jiFhjs)*a$`(`j}tH{eHW@zZfcy?I!#fzK3 zX+%bD(~bs`^|FL)sP#6^i|6DGvO68}(c7v~ib8O0_$&3`w@H%2=w=$tjj<$>v2h4A zN6dYpZmpI!>zbC~d&<`2FVos0+jE~ViBm08&8m7_BtzDJp?B)yRx?pyV?L%8I>q~w zFJ-eM%ebeqxhna8%XwFY*6d}|=1nwjMU6sl4$ps_A}zIGKH+T6Rd$y`gC!%Ld52xw zeM96{cE{muc5=ew|C@_);Zcp`X%l<5dibIq|N3dOxis&x=OU0eGjq {Y2#0NyN6#heb9v; zYI5*hqg-|}p4Z-fWbgyctZcFU0+_BMds*K+4c!^gQBn&Vg^+{C_HFNbHkjGAll3)w zD+}9SyWfW%03aKu+Srv2>69N5gtVUdphl~A0liGYyo%S5D@mr6lwg~2A?f&(IpL=i z+OQ$@sMj3>1A`mY=M)?&Kfjx!xHmAsH&UJPhNfU$X^u+8k`LtV2%1XPeCByj) C{_n8pnrhVGW(;X<$ql8(Jk7U-yANf83fUh>7 zCk7PWGe(lwM7*~Lb_}y+lkslDE3fj9lxd{@$;3l(5ELGph&&>7FNTLDhM(PjDKhc= zc2B(b(X%$;SOj4h?|#5PnJeT4#hHX_{P;S;b!)~S$0|vexmDvv)+ -dGr z?RV|=q^=L(J|=nTU3cLK9KFR^{1VT)!{-8Z+i_Ydki+FfvRO!5H%yOnlV$f%-Fl)L zm#2ETw5|b)!?Y~8dLXK;Dycc}-E(%qF7{lhHlG&Vc&Y}H$OfX2`|;`lqMRRW*&%vo zapJ@YD$~k#b8bIL{wGzgfa6jUQko?pM5IOq*WNqd$ToPqe<%t0NKSzjb7j!r#}ZLK zD`<_`S?k=1xdx+&s;WiBBP+J`=G=u;e)0nZ=~(nA9crm%SJn#=&}dkmz6y@4w9$>) zak^qYlg;DtB5XT7d`qpaGu=id<3T9!kV2MiR?le0bM{IH>7(T<&veY%86g>6K`>WE zg$yYbve_ht3{r|1`KcZ`pJ|!#VS&MGw+kssr;KdmS8vwH`^Sp29#}&R C60du0yg)*P(XJ*j0fm31k|SAd`tRrd>wBjjIs$u@C?pi9`;Jr8l>>bVfCH zR_EsC%j`@+>pk^qI9WH1+A8Lxy)m)I7#qR*p)dx7&O~{F_&Z(Flw#);a)Wf`ce+Fa zmj~Id!)gFvnI0#}G#T43_~3~53%Jz|P#l(_Na%V|2c^QYN@3}J5e(q#Qxwkg6LzG4 zvIUPwkdMH`H~~NiDjI3~RW>{OG7=DeQj==j3HA|S+BCzaVc0ry3swUqmFd|^Pi5)F zm#~HQ3<_nhPx1J0L&UDC&ih~}34k#}u`qZ98($J;+$Tv}u1zooG*bZfJ!SIL3U#Q1 zN`fe)Gc7fh!eBUAYTyiMrYxE!VD%4l$i15D>T2sx)y&Pj*%3Z{l?Tp5sF~h1KQvk) zmL;Z%-GRkZnkI^Rr-f?>ww_B!FD{R?qxKwI(lX72kj=AA&KF@ESU 26!c#Lp|gYtv?%J%0fcLxi6FBil`cE7 zC+zBMZ2WG!4(Z{N)bicJ+byKE)Orm{h+3gLVw_M;nU&S17*?1)#k;V)WB5w(Q_CrU zHvavTB*~x&qyJlMp*cPvKwlH>0Pt+0%TA)c2f)K|jKdd!zh%d}73cZqZxlt}wi2+R zUw?u?g`;*&5;a2)e#)V+{I(2gt-uZyh~-aXLYxmwlvCaa>@udkuXnM6I+sLew?xj( zPIEQ}OdJI-T7_^8`idbBW;Pj&?Qh4G3R)I|CUGj(@z+ur*bx=28)S9hcNZPu#YKAv zb~Mb)L3RU&!$oEzxrB&}nSA~O>2`HMaN4|gXCIb dTE*8|wq>2F(|eiG+wQR)92sLSv5MKoystzdB1^&ONh z3--XwLtmJNngLGNOx}!|i=GgRG!xm&9=`X+dtub78ina?D$9*( AV4| zqJB7rCV}4yTDp; $av};YmAX7pT0pXA4xS$i zIpr*7h=tE_x`#$3N=Y`meq~%q9wzbl)X2tD!ogleO0v(-{{UZRGL3)SpvbVrp#2K{ frO!~+H{4<68lMOEd9+gICNzQfAiCEc49)rr`L&KA diff --git a/pix/layout-builder/3-3-6-0.svg b/pix/layout-builder/3-3-6-0.svg new file mode 100644 index 0000000..8d7a498 --- /dev/null +++ b/pix/layout-builder/3-3-6-0.svg @@ -0,0 +1,76 @@ + + + + diff --git a/pix/layout-builder/3-6-3-0.png b/pix/layout-builder/3-6-3-0.png index c7258201735dda2a622d3a8c2b5c08e6c99e1eb2..dd0846a3eb06dfc29da7efc6c3ec82d9ae36048b 100644 GIT binary patch literal 4685 zcmcIndpwi<`@f~bQ=W&X6CEgN@~s?_iXKLV7@ sKIrP7$q{0=ttPHYt4Fv$jw{t(adejqN=;6jN%Tr+| zQ2t?PuMj@~jYjJR1YQXB@e1 qqJ2s 0ZKLMny%JbyhynME-rmV)c6EWpW?Pf3qSLWX+gYg{rI589jsh1TO2HqxB=X%!;>q z4%Bo5E^nKaT8sC(FJwHtutNIq80q)sJgdYlaEvHg_yA!HcOY^iYHW54J9Z4TM`#c} z=|Y-;uQ_Qsa2J9=;0)bD)?m~Kj?5@q8!NZj>V+>wceBj@YXI}sRZ@R_Y*Seo0K&^M z|HB_@Q6wC*jX{=P()u>o!^U!oJ3G7b0q{~;rqK@gG#^b?5)9nLt<9!>C|g@!5a&xN zbK1LEUUZ;6!aEF8&Lw{Lac`4q91<8X?H@L`xE)}JZ_ipffV;@NMG++(YfZJy-*!k~ z4k Q3~jfj zU>pElE*S^^jVT`{`6a{kD9!lK(}|a|@BuDl{$4r*zoK1mkZFI+PU%D67-Zi8fCZ3! zcw02B085nQ${tFtUvil?hpaJlhL4;W+g!HR5L!jZq?rwS>k^T2M})V(3t4>fgZ7Us zVSh)&d*0w6scPsc+(9B0q|09LgtELM>a-`EE~Sc8lTV{xlqoMY1?+dMe|affdKi8x z4Oz@)IGCwDIB+S0`J4->EyOZas2oD3?T!ly7poqZx{(WCzEro-yNvq$uv6dhJ*Jjt zqC7Dy_8MxMD-;|P2cC^TM)p(}&fw;XJXcCGsC^(wEnR@Ou~}tzBB{3p2|j+jq!f+f zULlH;F!IYS?A#t;vkTz4$is)5!@`z+3Lp0_xj8uUdz3CGhg;cE1%7>^|2otIw1#;* z7LKsk*6;2+{h%pM+0i%nnCMlJYe#BucY;|Xyfhy3ffSzJUBQ<6m8S7#Fk _f5JYOp2uH@1UlhMm@h z*H>F=u(7dUAHgNYfA8Oarv__jS&~yFAytu%DVa``2#~?SBjtQ>bD)u{l38^f8ug?5 z&EFtOkdru7d&Y3f)*x>QTQ548vIRSGf&&r=as^_x;FebF6kiP&_H`o*>*5JN>0mmU zE@11|ugheB=oV+Kp~8aJN&cM;`ae*W5>oZpQn;{@TZ7HZyS57&mwUfR)gHxPku==B zraQu}8ljY6_!W9M$ atRaIrSEmrt0{ktMs<}xVyM=q zrxLXswiKoz$2gnK*p;7y9}YJOa}jx%@9SkMKe90AKiDPocHJZDm1jGV!TwqoB+~J_ zk-am9^u!2BOP!QWn|Qq`c1`GQw4s|xJA$7UG5e~}{poM{L8{yYQI|CBFeL&oId^>5 zgh2BvE#r#(ia>$s=IzTS?Uq1T;&HxOso )^rX=*S zVu31!zKm&UIdQe?{T@ogeR+Bu+W_p(2G7v(dk&MMhf!3+fw&M)4*O!QEEucwQe~h+ zsgw3HF%jp9KRiBrea*<)#u@>>1BX}SzoOC`(@#8bq)I-%If9o=>xcSBCK^WD+4*G4 z%gs3*HUlYJvZ_^d&UbOCmj-6a+1nGN9;c>?17&TSeVAR#!cgE=pC^@=t7LnD;NVr+ z7t4A2`-vxLi%cD+>+CF{M0kC<`%FUTmY$VLCsl!%Y}?IWaOzzI$kBWn2%{9RS)@ zR=hG(G&{2dB7a~>kj_8y-50yLp}-;101jwW!OT5|q#=~Z4Vay7A*>7cAlo?>T++I2 zj#K~u(Utps&KrG>`S}Ihnfj*tMDC|K@Mz5BL%4y;Gi96GH_Gja8=TzT-OmJ8mxQUv zNQyv%raqH&*_xnQU$_#xap4tUN}g$oO@#Ft*|!$~z!!7a$g)KhbnSR8x98ts->p-7 zU0t^CbUb;|8&*i6IGG?9T?5jzW39ZD+;hzh8wSgm_6k@{0DvL%5eBgIy1E?*jv64p zFj0*BUp55yHU+E_0ARXxvwuwis5=A!zyIqlQbSn`WvDx8zpbN}SJ=7se-?Ei3M*bg zX)q|uylG45H8N@Vb3vop^Z6imLnKke#xnUSM!<5QFX?ji@ny@7e)`1Asvxy(TmK>s zT)Q|=#l>&$d^8bh?javD2_}j$a=<~Kq2>|-%%{ 4A0CtKSp z7^rReA~KY=0WtiRHP>wbF|&GW^fUGsxz}w#kA6#eZ)cZNU5tiuhr1?!X3hW-qa_wO zs}YXj |3|4gg?mDOzqZ{K(HjlTTT-rwNZq!!Hp-FL)Ng z4Hx8q7}GzKt9SXt7e3Q|e%CjC 62ZMOIVF3j^+{i0uI&8};v&wu(8o zPXqCkL~K$X+XbnVEZ_Wc1G!65``=mrmm1XRk;H;Yp^L3!b2xYakqPyPijg`HTdnXW zxcJ5Er=;ZVC&cS}kr&h7u!ElL-e#K^OL)AEl&o^m*bBC?KG@Mqumm`S{% h}UHBs8dnyM5u?)ml4I4)~dapMfGy_oW=r zMHrk-wIwY7{pO8Ih`;AW9X%gYt&b|=DO7iuvx~#TC_Mo48Tra;b^fnU`TWgH&I*WJ z+L$QRU2Y^s!g7{a&s9C7AwlhuO`b_h8wwuqDP!te&)c|X&ml(GJ_3fYx+;pIn;GlZ zS%_$!sb~Ae;(N-v?mX%Dg-%s8pvFg9S=lHkf0=Jx&A@a6T9lbt^h2q@Gw)pUxz=Zl zy?AaVvH#PBA1rO{_<>fpQc2Bmr*(|@jRpSwt*!Ptr$r?K_Ny!UtPool6rE@f7bVHq z-LIEbPWGSJD z3u6(oE(GwgvZBzCzSuk|a{=pV}7arAK ztl@#>-AbQiqTF6y9zD$gd)}@%KP3uIj~s4=W5zy&*I?_n7$0}>WVJ~9AHb&=S<{jP zv*;vJ<@t;Lvs1$?jJSgi^>GQR_adziB09@UENxSx2CED)qB9=RllL2|z0Cia9aE8k zB|dROO}18k{dzU+g(}EXf-1wnuHzn2!7eCPr9U|FZ8--V?d^r?tCb$f>r^{kDUwA= z><_+gid9KyY`oBFgc)yvx>*RwmEBjH8oS!tbK5*+AJM2c*J~Xu-;btOJo2ha)sc3h z1@Q(q2B(FIw8pK`6VFriI8d|K>S{GyEj;SmuVmVuZ^&*R(F!jR$**{|e}B>bfF|oZ zn+^8~(PU7Z()yg)!;Q6G1DXgtF85ex1|5;Gk3M&6I|eo3rUN|b=mSqsEOweQ^Gwy~ ztgi5j&mFH(d80HqW8B-nBJ1|T;bQ?t-<_c^9s8N<_q}yt5YdDLonZWjw3EN~FlPil zUNdGqkkXALANqkT=9-<-lc7+8GsP-FxhytrnRH@!SW-K}VV|MkvDe_T8gOK}bV|IO zWyqwWq2>%im17}MFE{5cZ#Ho(E*=>zai^Xomony03(rJJ9%^cZ$~4N2T&{1(_dgLe z4%374Ckd$YQ#41V`MF+W2nBdq{~3hwyaHK_3?E-tyHoZ0aDJyYZI=!GA7#)J7C_~& zC8(;#wpJ-0i@youxCmdARobQc{b5U2P$6yD5m3Zov%yR^ZQ4h7in#k4Dj}&)N~rXx z`m2Vby*m`~ZF&+lV g)mZf%-PE;mwWYGdu6&SBTxshVx0JVOjd^1GaqVc<6^)ytgbNTcZTho0A* zYEp>CdPY|WBWaXqBGD5wn3HAee~ZJe4F7~L(;gNugiU#WFktZSRB8k-L5p0`FS@`G z?k4YZ-#u76EjFEe7a27rT4|WiZS(ZR<>XpH&t}U9l^FSU_wN$ZbS~WAR#=B3KYA3< zlj4%fNhJ;sZ3;{l#c @6}SccF>(*c}t`9GfC6?JY=0 H&RqQ;9Otg! literal 1896 zcma)6X;4#V6#Zh@WV2R4MX3r@(P02BMPw0`M3TX{N3fMeB+_UC$daHzNKtDsu0YiS zLXB1&s6k0d6pVo2QbBQnB0Lgel%)fYAb}vpkbdvs#Ll!oI+>Su-~E<*=G=2n_Qv%g zHkOW-000{*g|ry})0;3RS(w59VDBxx@MRVg8bSgF?DvbTBo}6;CQ`O117I}+dk7%E za28COr%-8Rb0xvi-qA8=b;NR*a$;@`PYF(7vl;Oz@Dtvc#Mqg_h@H=6rhGR)gi6~O z>%lOG6`H7|)mzg#P cjx@EsJhYgw3D$1gwoKeczrkB&x z2v5nX7TTB9G5#()isC}=3^z%A{WP PJ4bmc7%oMRn;q p! X(e^ 6t zaqDan504&jD&VSxZjIrQJ4iVUTT=kuOQhx7ZnU#9 QSvEH>O; %Tz;!8c-Re7$ z*HrJ{`#F@9yj6V&c-|5$2f=X?BH+uMqAiE(Gv*;xJ|x20hX3X&2XZtCylxVB9NoUT zbV-G~;JO mlan5# `~Jf>|7ohb({g{a3(!pZAh>RsQqEiHaL7j_CeDg56wO`IC_6P1fpBO~6Cg~cKH z2d>VE?)yYy7b+C>Q>-`fpBdYI%LSy}7P`BHz6ehrrMps9tDr~}wzV^wI8eVKS4)=& zOPw1lECkB{7|Bd9kIoazyJ~TsyeJSY7R_=sNEZmxvZIjFgNlEt zsY ?8ujyj)Hs6&eXXUkcjjIX(jP^ zGA`{ksT>D7DR#R mQ + + + diff --git a/pix/layout-builder/3-9-0-0.png b/pix/layout-builder/3-9-0-0.png index 487e8dafa7b9fda41a0ed345821dc43cb11af98b..03d35387ee4f06cc0868e33e7b7de15cba5d6667 100644 GIT binary patch literal 9536 zcmcI~cT`hZ-) R8ZOgDmt{0A{{JL5l|2ikVNSaAyPvEAu38$dXdl+1r!Jo zqzI%8A{`QXfItukM8FUrgg|KD@x9|a-@ESp=iasMUW*)dviCmE{ MK8d|)X(IUB z>EA#gkf52Vp*09};1TfumH*lgy#85H=Kx#|J~VX*1c44W{rKC{3VY`Uym>0f=uVIg z%p(YXKfoOXhr^Y;{h)!a_aC||!2&$97j;jAK)-{`46ob{&0&orf^KuScb9p&S!H{r zpDJD+{zWEcKtj>uT5p89HggjGeVQ3}QuSnm@$^o!E( zW|xJko;><~FzKm8z(F@k*Vu&A%Pbw?ls0Cds|!CoXId*FX>$do%0n6Chq1f9gf2CP zJ7Fp #nqwfVtesrs9n-$bfjiKzObHpJ5@56kn&EveO=-0o*c&$8fP$1Y%!) zOxwOV|L7a4NvFCUgA+{GRR>26pBrR(kavwazex#IpbIgx%TFojuaD*RU(B9Ji#0_z zf3he#weF}UZ(#rB&U?q~m@z2kv4N&fn4RH{iMoPxV?Ud?*&_9jF&JxF;4&6gbn24| z##Yn$ON4FpC85ob{w@^#7R^Pd4y?|~2|T=6WRZRHn9#;HI}=`twa_dFXX9Nkk735p zPLk7?^#){)f3Eke0&w$)^DdAQQI9N--{1HzEj2y!e0Fv1Fn5#z1K@a9)jZJ^$|{uf zgt%bpq;yu|jND>ehC})Vo_mSwuJ&~JPk!*M_HmE8zvVGhmNQ`tl@GuAW#_d|9!2DI z`0lpw8nE9#jK1JRYdh5TYW0?Fi5WeAR#F`+3deYmZ4yRL# -bS=sDVZfcMFJe}p&| zw^Ur?yK68rFEHKc@G)SefO}#KBD7JBM64y=P~}M_=wh{o|76TMeEcO@pWG=QZu5m` zNzixA@tzI;`i?CtRCh 03!t+dJ|iGFl3Z2szIfDN5$O_TEpF#Nz%m`J!|)QFX@`qor{v!Gogo(u1aA z^@dn{L-nC&mHv3}b6q#g T_oMEQ=|SztuD$ptaz>2ZcbT46s@-E$ zaV|mH#md%#6MBaE_`olv;#{mya_7JTC(jp?X)@%4fy$a$`k9h=^wK}X5w 9;< M7!xl%Qh86_?3(fylYc`j$=H~aYEX#nMOmF{IHaW3n4^8FI;*x1HA(hfJh zRU9E___oyLZkyU(VoM`rr}Es)msq|JkQi (4#bN#sILrVdwl)uMK8H1 zGg*Ba0n75Z7chNq?fVn42Tmv7w~i>k^jPE-aA$Tee+hMbLo|5l@s;j{dd8#GY=1DO zE8kE(S|^p6X}_c)RA=%7JI$lJ12K}!D~Y*buT07F!qj!XK|I@#3AwD^J$;e5_Sasm zY;msdiDV(g2Ym%kpWd5A@thHD$@WSz oel%o!@ZQfigmzMn zUA(To;<6~M4 IR{M6YTE|8V%@6 d~@c1oAoGALXg{nXuY^dz=TYJE{yXReYt@SADjb#p66d neV #)(G7_~fztJ ;}59SniCJPEmy3^s?z)G$Oq5 z6`xpCgq-G^Bd(^b2bx`v(|BKUeft1&+4Ke)p R-PQ_R;$@f3}E9hi6NdH+nEeLg)rqC_(Gy;ap3 zb^7Aee7}}d+ TX`f+cWv4h*PI7l+S8??CVR>m9zXd))3!qeq$Bs<5NY6P1eOx zrw=~6s_js|)-o4nQL1Yn*2DtGQ-oPy&L^aT+_`#MgSU6P?+_GNC2wWLk-CzS5}r5j z!$Wp6Imjp4A_RXzk&abOFfMksVysF-drSBIS?R`c@Iv3&if$y<(~4BeakNgM*w`1V zA8BT6gi9up)$ear6p+rnFjyM{r`GEo2`&TcbOZA)_KqV|)T>!Y-@hLD eFz2e!kjW#yZ9yo+vaIoKmm_J8%;v}IoeGM`QU7UdWYbdL#61r#G z2L=qSP=qil+BXnlqu0iAExZ+Y PA^T)O{{EgPxy!@O3D>q$AT74X*hg8bQL8m$heG4|&jFw(mrz!$RVn3%t@z0=lk zhipJ94&SQaiwT$4dGt7v4ES9wY@V5|ZKSnbqU41)Ih#mUb>s|}8lMhr_+Hr+y&ZvO z 8siZVe@GK*u!JC-9}F_V6L#efCCEs)>GvjK{8lbOsa5IEqryEKssmnozyb| zA%qpTy}srH1DRc4Dbj&NFO-YP1kQe2wWl;}MeI7in2uMPKMSQw`go_F9DjIi%?E%l zomN$4c#BY%oR_DmTSKaJ-`OevVD!Gch`K?VfL%&3c`+}Yed)cF9MxIlLH2~y_QPxn zQ)p1^ENZhTA#ibF(Edo;S@VHS=+-(hk-xoTBGx)G;#~=~H!{zDCGoacF4x_`&h3J# zt8vXx_y{h4H^7rV@cvrW?AzDZ`u##?Eih^~>B!Qzg%*x#$e=_ihl~>&jNX|{Pamvv z%kw#3$BYwmbMeZHh1L3P-K^bD?hc6>2_^~O%heA+0=xg(mvLe|V(DvnrDq~v7v66X zX|KiMubSEBnHw4wS%?vvvZ#gTPj1_lV51EUJ-S5gCcF9_0@uThOE|-uvl^5Xx%}I^ z55pZDr;d8ktGt`4XUSb%1D!bt4Z7x?lL|NU^D9607in?;cfV3_F3~^m{B*j1w7Uab zEg>*~?~Qc@Fm8)=R?6hB6BsG cS$B`3j>gD&LdXJk#3>h{4V4v2&W1_eTI}L%2;4#imQfeX;&P*- z+J&ti*p*|U)TfV^32UDZ%@c--t>&A__-wz^3LIuB`V|l?< !!7n8hAelsPNVu0IeK1o0p-u>FuFq0v@GGD5b&e?zXyGnZ&97qwj z {^FLlfKi6cW$m`I7RtA zoDF8@oyjPqL;H&phuK}`*H_}mVyAOj=`Syy`r$5wmii!-mZcFm>##Bw=# oX?ZLP5sg;#m_Szi3Pxq4)9N+G^gMd`l@2@P&dNF-anBTcF19)#|Ll5oeFhmh+ zh3q1W!j~Q+aW5pYH*`8HBbaTO+=ayROlO4qE*d~fX;}uUP^D`$Kl7kvmWtbZ&K+{c zyi8#sunebrL`sLFqLO07e1TN;^vKlaSX+k|aFT-ClBBsW5cc2;K>BNHjZm8q3g`u= zrkO0yfxW6KDdgB(YE=7J-8{$9&MtFoI7~5e=7q)pyE-S>uJ%-hd$*T3B-l0s&q?5C z9?C&SQ1b6&a8p~BKl!8Fxjx(@Hz6Sov#=il8#%R4WHrr7{}#I%*qwo|gB>GV$N2d- zC0fmUTx2;ZVo8Qsp?mML$b}2N^VLUk5qe=oZM|=ND9u1}k-O-uE^`a6S#UKH=j`9S z xAEID?}MT#Frh_VCUMWm!LY{}-93FG8xe>eoC zPe5@)UEr6rMoPDO&JhofQyZD_SjCICwu6sqZ7-A{RWDt<7y;pe?emq_f-Ov!yk@i} zblpUexNH5cmbgnejkRZ{*R3h>Y~^v(3$#QKPn}2#BA;ERA#{<|>f`p~9FP7$vulx~ z*~6H%%!bw+A9UT4*)LVU?}+<~S|paL3QeH-hzi%HKdV+OYftud#!H0h`caFsMRe9e z$HpP!`H-z_KQ21LqO}CEDAl=4n`c33Jj`N6UrlQzjZo?Y(H#dvF~v@h@1srz>>xtv z%Yhb7k{_-PlHY*v<6&sbjG8>T?9GqLc_KQCrkoz;!HcrFe9W40t0Silod;XsYY$-t zSez|1P50EUnfNwB#m;12kjHGVaaL`ZfG(~@#f&%3O2aAKW$hK+k>1(Y3B+^3XmFqo z?hPe%G0$nr0L2QyRX20<=Zo*?@G%41h<9^$6e$TCSz_dgJvnKNbRG7 Kt4cee(O|gsO4V}vD}gF zp2+#1lZgfOL1sxx&c_T5uLlG~5t{8U|HoRw$pC?if&;~)U-($4q`*H5Lu~c?1-cXf z2D`ku-A`)(5Z$)O(Y*Zmz7ri)%Wx7DoaC>SANYI1Bju*WaXGi9C|7IS!9T0 kH@xRx&tZJF}AgQk} zRYt}^CZ&1rJ-`%S2t2T@w2WkDW+FG~tA(h}C7W>lMBwYFm#)6& z@6UnD@pZ%JBn`Evg|F_B&YVRcKmwrk>qt&F!5Si!g4!&}7zw#GthQHpwBg*(NyG=? z`_w?MY=&!b*7NgMWn><&l^3eEb;`dxCbYaEupBC|F?odI%TD<@0RlSmXb c1wA^3qaMXkWnbU?R8D~YMDmItTH|Z(;NTE9!N&Qq zT>vlI+S;aL($j7G>A~THGczX!;$lJxd1soA)-99=(i+bEeV4zyzmGXcFAPbf)Ysoc zxVtw+L>vHi u?Z@bJ?g@XJ5z4|90jJ=I;nro|%k)ev=naGJf|I;i_m6dV#u=it% z;q2pPH=G~8?979dbg#r*uM;TlEr%#2l?05=oXHqUC9`cL32xpQLML}@3rg5DXY zq~KZ3M?j$K;Bfzjfk8kxg~Wy$89rabek)Z}RwkJn8^?LJJiqTEDx)t2IsMc1kbPT+ z?}0!MPq(xKY6CG9+wCG6H5N$uwx;x7e?wo|x8yJRa~mMg|D8|&KLyfL9O2MEkU;OW zm^lKcw5zg#jpw1~3JW%WWYE7G I(6nBi9S0_=l&euBe~wD3?yJ%`<$GN zOs4bDc6nJ@874%jSoOS+(A=o{{a3B7RdB_>$3OCTFk-F5CZTUWX Q+rzcufnGW zsPrrUTd;@-j9S|W9~UwcN Kg%5(jo1n` zo$VSqXJ!VjxwA$iNdnJ8)PX}D_Wz-R+-X=#`d7qw#EZ(v z=z@lT6HB(B#q|{gz{QnhqJkDOhUsU2rV9~d6($1QT|4h)TSIC6D1G_!A(}fmhsAO} z{5Pntho=5BvoAvSINOT=tbMC&gcRO>mN4`AP?%8*V2sO`U`qBo`IH<)MiA@t_Vsr3 zPGI%`H9D lutp{C5Ru4Z|9vqOvNX4ul1nQ3 ;3Kz}~<8t6Yf(~sx1`Yu9awXx^)JHnaoC`-Q4cl zo=D3CTkkT4fmPeqmr=6Q0PSn54~|af6j@5hWM#ciUdAIDzEsYqRn~`CBxR{ao3xlD z4s|@)XVg&*a9-s)Ks_WcW7H40Pq(;sAXGgBQdd{swuJ)b0Q`5mV}4x6*027;D5S73 zy)tMHJTuzzVnLpnC&t3@=<=z#I)j@FVH0A~W@hxZPlcR2P=IU8q{ Ki|gD=RJ-tJfl6{wp|2$Y$|U|tQ$shR*x@9||)TPOgb(xdyz41NJ8 zrLeuZDLcLIP#oi1uVbMCX+o}cJS4>JfkUtgj9z}Sc4KQHzjyxwS_WwsWmAgA!6t5R zv}i;bw`}t4+n?-f?%16GlpbRg`eysi?c37knI#k!GcQ}({%)^<3jNda%b_hTj~lSM z)js{?< 27%?@7~#y8-R#Sc`1s5O#_lC<6e(l#|l#LN2!&aj*9xQH7zwCXzu9v zB%IeED>EGzr=6wh865!5*T0~G;(usc|Jvx2WdK15s<@eA?xImu)VO$gxAtRPu$X#D z!;P0oCr-iWca`Mr7Xf1e{t6gz?*%*6E+&;Zm(rnHTBsR32Wi~0Z{KG1(A{N14dA8= ze^|4t0Zk{fy$O$fE~0SW4xAkyGZsR7I7inTg(?$2IVVWjv#WI$HBC}dU8&Ao?)^fA z#MUIKUCmMG>m PJ za({681)KdQEe-JeB#nvN5Sv8tEG2vA69lEP%I1_4@&i$GBO71jizR1vGhs=e@@ZbskDZ!E|A>7mXtUZ-BhEy_7aIJ zEaFd vZ RL z44wv)l6I~?W7tB`tF MJF@yz#8kc&+XGOuCl9$@?L(Qe@qY4OXfV`hs zy3a+h8Yc9d`ube*>ul{Voo9{*Q|qR<#$l|A)=Or0SSwb?g!KZLxo>2q>+6$rxoP~s zO26@AGddHo1oT#)`8>~&&oxhX@{6TY#{f18MmrOzQ*7wssO@WRSHS8wf%a}+7SZE- z?1y$X$Zu{x^4hge?RS__VOx)_?L}@A5l45wY96nw_Br&-1$~ptmB#8ae|4iFkNhzO ziGFxTSy?<`!k$Z27k!THuHk|Y)Iz95n _;hfUt_F|F;@ozk zK 0S#6>o4E_Y^A@)7tul(;6Ts3=Xtx@eW%~N;TbzYAa&zV2^R7l76&K& z#(8V0Xu;93#MK$V)Fc{o5*xx$^E+J3qV7lycaCzcLfabUizW ysrw)U}{5`D*hSr|joGgf8dZBIEh|4=YYHM XeC2=LZ?5g7L6YKW3cRITe-i7BKU5Q z-GY-ktTST;t<4$2>UhmF6rE~33sfn }X_%lyDvyPQdc6b;fUIoKY? z>2_x7aD1SV9k4z6;h$!OJ%@DIX_kZUeY-K&NI|o#F~ru1T)cbd^-T>A7TtLPhKiqM zjfYM7diri`xEu7eJ5>~{Hjwd^l_e)i9BO={a~wJ|SmI?iv^7>MBxn}v5crj qHfa*sKXYqPXqS2+P_IE (H|YGquIhS10Q~xjH~uAuDdz zVpZAc_940Be7kNPz!0*Y^v}=2S{4|rk-z}6ySVX!)LQp=ZjP$50R)ESFSkZZ`OjjV z;F?x)u)&hO27$A_qqldC v95{TNgiF;xNA%W_@zbpf z0|xW5GB`pFwpJA Q`PSkv!_D&0D+;t%zt%jnA1fir*4#lJCuYP4`iMRW0eeH}Aod~-Yxj7zOW zZ7yf#BG`ml_9oyes?_#JRaiGBk~hadEj2z418`gt-!8SJ$DP>pgU_;tU&9GRuiiyy zE+E~~<%3tiXu`USCm4ai@~KrZZDV!Kdvg%#>Q}glL2+%1;|;=Zn1scHSXeK9boA>* zPhZX~tHTFXI-8zJ_4S`6tU2}?Y5!Piqk>?k>mUbXlH=@i5dc|50bT-XG&*qhUqFIa z^tYD2Zj w|OKY{^^Rl4y6$v^f54_-N`aGp4j1z+{*F4jf>cRT&P ztF-)Z37Y#j2EQ>Id)zbc3(0(00O0NkIv-~#%H#(C8VLh%tzJ2t(%(+2#g+7A)q34p zHq6Br6bK*6L9p>Q$ZSh`%ZpY?_$(Go*cJI#P^$n=-k>BKd}Cnm*0H0>c&rmv1juwn zT41Uwj7?94%`pf&$X-oPI=}()zcISA?bW)n>}>~M?F8SIQ9 Jp>{jpB7oYi z5+YbvYY!9zTtPwk`5JgU+4l!9&70d-zGJFFpICx#-D(yi;{mEtXDbKe%&y4gB1-L8 zyWUWm+QzRB%|G97kd~L14^Zu{fxkyvMaHCMY7A&|3 AVZC+7#h`kLIHDv7{uV6iv#Ed3ts7B}#CA zd^NwcK&FPYx;B`wfOF<* # zk`7CZg2SSUmqlOS)I3guG?%Ys#tac#Rx{mMCH-2)ONDXx#n(ymnV$`Z$+}J)#iSZk zy>9MwM?$9!>Fe_$S#o|>DWaacFLLt3m!aZ9qCUfi9xGh^ }4ntU2BV^c6FE7qWXj%7r5Y{%T3!#X7$Yy;8u(=+V`e+t&8-3$4Ys>Vi S_xKM5YG!0 Z zmn@P?Wod|3ni$VgNDL)%DJIp(&g`h!_eEQe{bRp*zVDpxoH^%rzH@%>NjijgR8rJb zL=Z&DX}{fJ1X &1IRu@>S@5kFyB!^#*uLA-VY) zz$i~~!r9A@N@=R;ZPs#)QU)gN0N0}w+YmCD6iflHAmbU5H-+S -@KpozY8K?YPRShXZxR*7?GF(xY9!b ^)R&|6oWzMZr zr#7;Ax4>Ivf8erE_RicEW4(ty!J=7xAJ=ESxNhR%!+4e_k;oBSe@t9R-)j&4D;~mM z?Tr*Kkp0f-7$vbi{|yIO$a5Asy0nzBihwb2b)a6b2dc;W`TTfRRY>qyHJ$Fr(&!7k zHFT%m=>746Vg8rsfeAGos+lj%7%d+bK%|#h)cg%>_xQ9>`0$DC>dD>2_^kCbIm$ zaV1 4B1gp#cjr5&_?-ULP^)0q7?8fc>88L0hk(kTU%RVTiXM{ zus4jD?O4zsueF6L^0^GsHg1!lQlWp7EFcvCFRG}p#9)$laM6Myv)Gfry}~dUX(N2# zv#C}~7!TVzE^kxazym N0DOs}Et0ddB%?U7jX7-T+WrBQ#N5bU%5et4cVQXL3cr7|$*lX%d0 zz|wd@JKAbzHX)1TYG9E5ZukoDA<-l-EVrLph;a0P6>Eo~{9-`cujlF?!EHEK!0|Ip zVrIBVO qF}WDpkFb%S}vdXl}k>wzxQ_BUZV2tSUl*@9*J^G7>t4P}!f? zE!cxkgH2I{XqT)oaksUW?w#BNW22*^&m~@1#@xx4n0b@172p^Bm5J)Y`TAAc_L)VF uDyp2%&F+$h-7z-I*#ad}NdGjPM>Hwf8MpMJABFH>B2M;ryX*VB;{E|&4f%Qi diff --git a/pix/layout-builder/3-9-0-0.svg b/pix/layout-builder/3-9-0-0.svg new file mode 100644 index 0000000..1b124e4 --- /dev/null +++ b/pix/layout-builder/3-9-0-0.svg @@ -0,0 +1,68 @@ + + + + diff --git a/pix/layout-builder/4-4-4-0.png b/pix/layout-builder/4-4-4-0.png index 66f04fffd5b3deb972c03adceed0ea192f44de7e..52e576cda1109d7f41305afb66b60cadd9b9d965 100644 GIT binary patch literal 4884 zcmbVP3pATqyH0=ePp6j|ziCUWMTbu54I@g6#I&Q;qD)chQd*Zp38`x&kw*WH(kez< zG(xmhj3LPo_eS)FDv>G@k&+fgki;bk5=qXdX8xJ8&a8FLI^SAiXJ>!!_wMI?pYM70 z%^zJIzuc(15d;E#dHR%tI|#Hs85ke?;&b5BysFU$__yK8DW6yn=&Kj2f9u+jzk~pj zJK|29kMlsn;!u}jLP01L%JgznL~QV-E1{;y7&uX6rwamo{qVHIG0(&T;Sm1kcOP*E zvn-KND3I75XK%Rt)1C!d=2XMp+f@-m8$5mvN`nO7*>IY0qcpSE^{s2!nX;(%utNyr z$U#?p*W+mCh_Y`&u2@j2;GiG=bqAz*?9zUZ?R&00+I_Gi;51wFrzo*30jXGzDic$F z(jz&y2e#go8R--o`g@E$%zyegtlv!&ZG)Qss{gvD55l>KuabL)yTd?Wj`s9lkb=OY?as z{~?6-VoA4l&!AU1LLLOGQ|oG}O%9W(R5*9SUOnf53~4@}c?6md^; R^0b+VjYq*YDNP zqQ#dUTI80(?FkLQ!@-S9Z}SrTZJ_~4R_N;EAL{F)^j0({;JkRG!@KN!ot`POr`2IY z!>fy^`apMTp6l2vxzZ`L7a0nBVrwXJIx{WU=Pyk$+sr8Fz#cNx{ XJ08+=|8=!8X?TmKLk+ZW zyOn$SW~rMgV?L*yW2FnBj@=jXS6A!@^YFLBl)Vx 2KLZgJHPV2ULMp>l38Zo->@=&Vxgix9AY@qwo@m!9%)Z1= PeKOKzQq!mcm$Xi9_o63*wm1C*xVei z$~F? f_%y39*koDV$zB)zr7oHds*~n YeARx2eM-J<={zZWd+5=;^ BW^jJA34Tq#ZtSsvdm6nD6V(Pu^R21 zdyneE^kpOsuc!G~^XW1_G;HTCe<{Bj9l<_G-*>pe-_*1lrhLb0# CnyS8Fl~-|CN1~bq%EOz!y2q7FOS1-$Y#zhnFY`r{p58NQF` zS05!1bW}ck7*8GV82s(S9abn@F`Jr)hq?`CSW_^jL=Ml-|9*ZvH*}LVoCYM6GwS+2 zjY%|9Bv^^>IFCo3V){1Kh^G+j+(Qv}#h+!S4Kzge<2%O5e)W^=zDg45IbAj_mg_8Z z$-wrp9rmno-0byEJlJiRX-!pDAOglrjJ*A;By|Y3ltW!Yp `WVsZ>OM6#&c3IM8i5bUcGM2Rk#LKJYgxTQ084SWnzRN K>_iFBO8bt(zsHBqU? zN2v?(2euk=5Y5d(T2ANkRlSWVGUP *4Few?BlKFsDF0L^a<8xxU4uR<$Tv- zQ;w66%IgwkCsF+-^aa8~F2n+Vb>Eb<=8VMxr$HvAqf2)1j35y36GyrH?Sc($UX *xO?*WePsEIjjPy?MwFZtmyye78D@B zbofv#D?Ku_qlKAUMA`s)0Po(5+X8z3oZ+*w!Co8CT;NJZWxvg1)Qk>(>-<^?ppza{ zwY@WsMVuypK$HK#>;-{nr}>|O8X88H66d%cWx8&|c=fd o=&_Fb&;qn@x<(NI609X3Nn4%sXrCsy}9tdzKbKrjzDKMu4RWPWK;6nwS< z&_WSu$u#i3257hSr|tJ~t({W<<#aANzAT^iR=JjY-scGb9CZHz;PHz7Tj8}$5ByDA zpd7&Zbd_L5=;(RZ# 1 R@qPrUGao%!1E`@Ac_&OcrM`%)986j&+VT0bOHg<1K{ zz4?KfG}A@EME+f^szVnH4M+0u%kyembMq@vne9M5o&Qr$qX&Q2L94TS-=X- d$!k78?F1SM~H@gn1weqAlC0}~ja*_%=U3Oq$j%@9k{yu{@C zfVzuAO(kWUQX2KX0wqU1`gE)03@AB$-?{xn-Tv^}vj@XZ17+IvXNUVoQ`WCx0lEm= zS|5qUaD%hX;lo27? XeU;5Ax@BTHfzbz$xc&zct1R97E~ax3XhF`j z-{+ry-p!ml@*h?MZH@cPaxJ_6)(1(z?9-pFuMbRz(YD#5^p!5;I(&`$j+Nd vjAzfzc}!1`Y_*=C44k{42 TQxLS;^z?t z%E{LQzg^&6X-2 |Ei87w177(ZK7cCkSryzq zd5Vr}Td$ki <+W?7rM@z@8(CA&W@i>uetnD!ox9l| zz5LO+l&uL(G|AM5 5_(7YSE+_50OzW%F%n|ijHdsua$ouO4Q=JRr?hUTu@qwT$v=yaXD(Y&jITjkQK z;MyfwJ%3Q~-r;mm+azJ%n&&Ge9o2()unIB(xlGW+fm0aeNLNRGpLN;qIyu2W=I+lq z({c_l;rBW}vQ9YIsg^$Ym(=u!hkB*>`$#d0ou0)#uX8wvx 3WO9B+opQ|HvA)Y2$1uEfkX;@ZcYZVuzT0=e!1mbaWSC% zHt F4G2nsIu3ftpE5+b0H3tMX0IX9J?pc1o@@;FvEv6eM zG7lB0w2)D1RWII-aE{8+5e;7$$~P82Obu8*Z$ `=i#W1wh{xZ(JX--)+K*Hu#2-8P2aE(e6{K(zKDrcEpNg9Y%FG} zS6;~x0i?>jK&TSVtpsvYb=sl%N>L#HXQnN-j+CSbuJz>=GBGQ2-bfahN4elA?i$yF zU_>2#mA+*3L8A1{52+O3mq1mhG@VOVD%|))V=+KBI?`g=Of`~vpbY<#$g3AiI5ZkW zF;itW(Se yv02ZewO|1iWo;9kM1Ar_S(8Mwdr;9_KHuXQioLowbbw9wGdm@qWVXEtY~ zJtx`+>6*19g)f1N8fE?tFTGou>Iudb++9eQ?rmB 1Elg*(<@HFP@69BObP+ z+Y1-I*xNTfTFeFLgS%YRZ2k@L99iV1=z6drqiyMYyGpO~E^6}4?5vA0+v|X?5F3Jo zuv8Fi0-}u)4Y+eJY;?#7>EWK*!GX=9Y%ktnkwlOeb753BgMB+-R5r6b*La3V`Spau z3=g$ic_Muie?5_jYaCwhR`@F_VD!%7s}xQ{b1_ (V 5pfcFH@e4CX8^nBh&i-87
HyyeaG_!)6tv7jV?r!P5KhY+JPPx_JO+hU6Zget?MNq)2x(c+D*!tV6B4rs$!oKT zSqIndL}PX*dlD?63>VSC+x8uis)yv^V+YJ`j!N=GE+c!;z8-h%vYXWgTv*$oSWGO% zJ(7oRZnymISe)%AcN@K^FSpb_z5IA=M4i)8k+kx}N2VO8L`qRA!{`?g5us)1<`k|y z6VqpKGA(s5jW;>JpEGc%P0C8eVLg`f+uJd5C6}Ej^hPKce>FhwBY{SBg(yM(C?A;^~@n7>CqPOWSPI z`E+LH{7{ LA9PdqF_~QRbbuFnTfwsYt)h{t8~3FQyyE z3NF*no(h2LxH>D=(hPIQI18OY4;H$`{cwz`B5iKTv&oyxb9@bY_MzN_m^`G*Y}#U? z5P6;8W16sHT)PrG#2UT4Rj#eH0%7L^ECJmPkfYak84S5=xH6BDo*bcI)sQ9BU~Q`s z;Kc}hU$@JLbAeciVRU_h85lbtMu^zvqKbih0P >0TattFk zCrrkT!{TbMY&dBK_73X?HiYc)bp*bJ0eUkO@V$ewnY`wSmH64f{}bJsefTdt8(F0* zj%uj_m7c!d3^))LtM2Mq+U~qaRA}7MkyW7PCfgiB!1UY5N`6dt?neNJl*R2PlHy;J z6nUiE8q{ jSM$U2g&nzT2nxD&vg_&!w}Py!!TAR6bZOcVTc0@WOjplFn$ zhP1T9!(Mgu8-B8XXvRdxUzN-vfyxiuj;<66`vpX&S}6H_#`ANEN55@@X<^3IuSNi* zGQ+o8J6|!NaDaECxB)y3$f%z0b?pcYtRcw~aQ`E!XtW;`k3RmkwgKSh{;nq}7bD}= z)px&X_?l1?Gw)CYNdV@mOz2OeUDOZ0pgp-3K55Pa_#&uoNQ7mr{%EPa^PPkQUt3Uy zf+&XwR5VbRfQ*XH(R06Q$yBNW1t5ikbux145X4emnl~*678Kv85jaLo><0L5IwQC8 zk{i+*RNP|I5i0?*&iO xjiqZhg%tw2RTTcEOFu4{7+tj0wCH(6D+x6U`qm5f%Jt~_Rnvi!`A6&+l;R@bEV zHlPlgY^q4jxsg=J;c)(7Tq%BKNB7zD<*-jt^XbMxf?lU1L;m42*3;ADllQgeg`d5> z{X72LMk*J6_KUpewUylpaNhjNrqvQHt +z}Z*-}&b z&;Oi_y6e?tRb|$ygp83hz?fhcoO|nvkiYh44+(hV=*aUE Za|FA`5=3IG5A diff --git a/pix/layout-builder/4-4-4-0.svg b/pix/layout-builder/4-4-4-0.svg new file mode 100644 index 0000000..64d429b --- /dev/null +++ b/pix/layout-builder/4-4-4-0.svg @@ -0,0 +1,79 @@ + + + + diff --git a/pix/layout-builder/4-8-0-0.png b/pix/layout-builder/4-8-0-0.png index 1272f57776bdaf6a8d16166557d4df5f4730e477..de0993fe6d8075f1d96aa99fa30ff51e3e5e28df 100644 GIT binary patch literal 9185 zcmbVyd0djq7q_==dAqGvwz-v7R&KZ4#id)CnyIC^qEN26k}DyimDe;)&D6{VsWf*W zP22# !3Aix+_Z2BlaScavi|p58?4j|7(5tm<{WMh z^9hGv5A~LS!{O?F!2w~O*Kc~O!$N)YIEIHLBo0ehn*M$DRz91Kh?brtx6Lv0!*=f$ zo;@76Iq~W3M3vIp`nUf`+_cGTY=q$m#zrBD!y{&z)?W!^s{mw01l9_#^2gn$svbuU z6Sp2tuKwp};BV(PZ}>-*)jeinLCp! J!hnt3}jc|He*>E`G8`V{Dgc`Q%q zTFHf+-j -Ko^+bE=0eX6#s^8W2fhw1+s?;4$&y~S z($WyY6nX9fjy^4CDsd1;(lGOS8U=X|%k@Z3G!zV!Pki{$c}Ac*uG!yBYAn_c8hP|I zNc^~*)$ywMV03A5I+{FxMQWUqiS%uUzpB2AH|2+xB)9J!G{p4EFSPDa(k1eEW<@0) zZaIFN!Gl^cBH|?alnOfz5b1QNwPu*9wTiNDM^EZ_UP*!Sns;t9hNe~hD(scnQ7a>A zjz_K%BVw{=e|pF?;!Z)ae&zctCsjo`>6RV2K7Xm@3M}tg+$xD;dKLI>RyO57W}NgO zy*T7^;89kVbpF1cu9d>XWoM&a`Rpw1&}S;JhQw`7J$o!?Z{*Ul>UpP3k6t+)SmL)? zJfKx<4Gzr-5)V~~tQlu|KGC&P^7F^I`l+O+@~q`yE%W8F;w&^;d^a)LR=bDwD#2u~ zwOtxV5-5h|M6KDJ?s@twFT}WuN{z7L)1Y}iFQL{gaU*Wma+~w~59#Y$1&7Eo0|k2H z`u*L@e_N}7kl)fwACzSFZyVq5;*zuWxl^2xI0rkllINeB(_e__@=4aKD`hR>PWQ~v zF7QKj6Wb39NdIW{%O28~^z~)QOQ+W+T|dndG1pczGLw>STDr>&cqaR8*0?XU7B`B{ z_itm!_JDO vsMUi>g zn!h+(fw|@3<+U~g$yPpo&n|YcOJ)a=mzr!*VW3mi71F=0_P&prwe;y7WkPGyCas=p z6ZM@`NE9Kl%0>x>157Za6&e~^qL+FJ9}pL{{8lS2T}%fQiP2A8F7bbIz1_CD`ffTx z69f_+ltPrIT2FT+Lq``bn+BJAW*96+zss^UOka#wfh8x-1BME*yA;+c w!r>vHsyX36RLUBdeqVB zkaw6%nwp_%1pr9*E575dE8HAVcx>dPk+O&3(>@CLk|uxU2BUhDBGp-7$n-8oth~Dc z;m{OA)1x4Epng*EKvqc@_p(QBbGy-}3|n=stAjV!o|_jPoZDRS90k_7+UjzJwps85 zK<=m;0-me~D{a${{i{bR4KQ5nF~v1px(Hva|HaRVk*pX>xxo0nUslQ`uANF`*b4gRLHA~m6 z)ftzr+oBZ*ujg^3Pp>*DY51T{C@YJ$w57`q{?+m@VO`4+PV@--mWOjLF3pQLQkt1p zrhfqww(ZvPTsIa+GL-s;%~k$#G;b;~)TuyCv0OAOc}a8lSS~@){pi)F3|-F@KOYFV zpLfk&6a=8jp})PuMHti;0vY_u tC%4J+ROqf$B%!+-8n;3Uf8m zg?n?jqrV;Om)m^($L>o{Ra$%Bj_lWp6Ab_!Asgk?x|kQ0&*uWloVx)DPE9m?mM$^^ z(ELb+%T?s{80eI0Xsmuj4~^iM3LO5zc%fpz=Z_y7h-O6zz$Tr0yJmLoZm)*o7MzLe z)+g*y xrMK7j1UjNHG&MB~3VRt-J|s&m*yzl%k@4o>Y~tE@sigY_%$&6r092 zvu@|Bw3MhPpV`h=6`XLW61ZE9f7ULz+kwWNE{ZOGe%QQu=daY0B?q@+Q8b);^5#6| zXiXoQnewFSJ(`I!Zs|8j#V{k b&)ge}8!WJY z|8iM7cK7aOS5GKv%#61jgYhY7o%lxmI5;XUjGgy?6 5&^RNBZT!7>y>!d4K&Q&7&h$mX^UUM*^4-qR``= z&aU@)qA&bhB-^2Prl1EoM<~fSruZm#q`KK3A2fQj$506;3}=z~Gx=atAi^0LV;g`E zW8JGD>jdp4@V>M;!WsNV$3roUeykC!x8eSM#t?*tV;`y%y4DR<7?nj(2lGn4@XPTD z;a_s+^=UK6xT2!lC4@)mea`?E4i&%K2H3929)zke3c@02*GML;C?q*Me>RA{{lI&j zM+7g+{&MmNYpgf|wa R#$sbYO!M0ccm~&K9qIv-jUR>#{GfQ zfPFof!&P5T!YE|-2H1Z0fz{xyYDHM0w@+loF)QH^!4iFM`wTDB+a=vLO*E6O2(ERG z2(l}=zXz!X=Ms0wJ(~FbnP*U23QpMJh_D{})GX)4b`@X KKiKN;=F^j;j*NbIBmdE(4R#QDyH5X)XWoA#bC26{PU6YJtWai@ zz(4F22sZz9t5@>|!6NGWCu*^`i;uOqx@&$)6fzz~4dW7V?%>WQl=AfO^I%=(*o$^F zOC+; mYIR+J%)XC3KWpr^R-FYRe z&Flp}>*aNK@5N97pGBY*8~M37PULy3Qw$vf7zaVZyLIb!-*fK51#m}~y@>)d63lhr zc$Rp!9X+Y;NYTkXa|{KzlGA<4Sy}!HsW@Yb`Mbz3tp&Vge%{PTk&T=|&4Eu;;);;r zN+TN~Ya2Syx{ Q&`XBM(f-GUu-sQ5`eJi_PPhNJW=F`+_I%1I y zaGU*jfj^= #DZ&1;e$Yb;lm zc*S`in8_6GDb=fZ@=5!s*w54erty_j*(*fJeNs7w4dDAugzU@-?k+I$An$|KG=WxT z&y%hq(5!sAFXPEuH3D@{HVMOrR&e!-0%d@BQ8B7V+ppR`D~jzNi>fmL%#IMdi5Nc1 z3k6|go}-24Dp+m$D2z)yT`P2LPgk1eGoGAAr8e@Tjn4;yvBF0g8_PIV fTUe@baN 5eUS!U$@Q4O^qL?{MNM_|Fq?Q`P}od|7zBMIT6hr(6K z4aRfgK?O*g$-<7`w{3|Z;O*Y+VWM^I!1F=f*s-v1Oz->dWV)lS#;WGVMo+1=XZOy& z-UXhslH71-7+nI|H;2)f6ANO777T>Owy?l)gbVy$U(NKwny1Z`9xJ^b$rrhN=UYZ4 z15|r1^zbM4vOE+Hp;d8YcR|~h5LIk@vHfDRrCTk8Ns 2Wq4@TA$e3e#RyIB2Qd+uWqm|oVm-Wid&m1PgYePL~pqNALU z@&T@hIl^pEL9iM|9g24(aiHw5>Y$3r!Ge |qIs*NfkBe48F1{^;gP42`eKy*9=i zNi%#SI0 nXI)l7@ZLy+r(K=~B?PUiKG zryte(OW!yD57qp_d)vOLrYcqY^xTn^YWuv-@pf_fDX^)jPxtT#ADVi_G|NOGvNE0c z`%faD3{QJm RJ6JwMbxc`8yAO&~M}VVs``MDKl**O`M{{1+^~!S=`SbO0e>814;Yd^xwOx zLk|%(e~kjo?O4Y2pk!;U+~Rz{Mr;>%T_?ZF?XckzjQrkFK#Z6pq0=f)0bSlct^@+n zaEmYsQ+cO};mgxMbOkKPx8DH7xUs^;ZOo^C%e`f3dM$j%rO=hvr Ti5$blael< zPzji5OQDy9jr}H-J~44NmkHB~g#M&*`#2WxW>QiIb!OktOpkVNT&HdwHZ}X`=CG8M z%jFdrom>88&02BprmZj+$I>eChMx=b12!m9Q`B64-!R@L%7?wYy5;Bidd;f5?U(AT zs<`E`xAwn`e$4t_?|V-77)=diu1?CNj_XBl(gMbFGiPU|zhPaEEpY1#vk%;}m>JrV zLO=Fng~Zd2ky>`*aIKQ!83)sUe(3gw$GJ_)Hva%eM{QECZ@W^O+sLroFR`cx@667Q zIo!K`z|XH^_a6&hyom?zID3B5TCdOkeby8gA#0wL)Y;0_Jw!D5@05gD(>u=pbYIK- zQ0K3a|I4!9B@X=e$GKbn|Kaq9R-`0Ai5d~NIb!eVzK`{D-!)Umhg0YZzv#0xeh|OW zxVjXqs2Dnf&0cmkEk9JJ`)i)+`%{s>x>|ckzx|K1VwGBEoM{b_&C&FwZU6i-h`%oP z*?tyAVK=Z-*drPWTNBVX9UZ^J*D;b;b;0yOP0hrS7)swT`WFgwYk(v6eq#H0n(tJS z#giXa$aTb?`T>$0#}y|-iJ@z`IRLPk)s>e$MVo#~qDTAP^wEfbLs!2(J8biIvxf68 z34!LdzRI;+T4s{PU2m5Z`u_i!aJeO-qXCe}>fH>DAJ^Lf{cZcYd+;8qIrcY&$;#6^ zeSTZZ!(h6rc4YR?Ww(!4l$Kr!9F>x4xbQDV>;gyY25QZGsNH)oy${Xh8)~Zlb&UC% z>mKC@kP!cMbk|=Kk|qa+hf%-qvrh2DABl-jQ$S-?>ETcI!IPLL9gA&!Z-ktNL6pv(b5^#_~Z8 z6fvoCQl;WYZgQBpXtQP^9 NlLn~ z+`){u$V$lMAHVeV*tc&%itLZC_+DJbo=${_PJ=#r^xVE3h(I5gpCZ_%*92sr5HXM; zMecTXM_^=vbps3~uFXE}sh(I<7fhH?SQ{?P*9~-bYFOqCSb%iln81;6XMGrNV(W_l z+T(QLgM*;SPt9j0Ns zlhpxG<8O9t3BJDE~{!9z;>pK}d4iS{eS8pha zdvKu7=mVpE?xiZU$yOhT$mGvlI~yJYCEcovULh P@|+)!EOSIM zyiaj`u)fmDZC%M4QMwc^19gcJYXa5h^1AH3hhO5-g}xZMM}rl~Kk~fnCR8C`oS?9; z9p^sH7n4O0RrZJ(OGJZ+FQzIu >@p5I*RI8Q?v z+jUzZdFrl3@E`*}JJ>e{IikoYY|7>%1-fF$W5Z}oO$H(7*b95opWtVAB*-CzAFVrG zf<}*b)-_3!FX)99*+F7g0wzfu`Z#N7{ETnv5+Q7D^<-$v_P&u(QiJJZ)sGeV`=Q7R zN9hh 8;B)oP(N?op&})6GR$oA8dh(qr@6$ z45A`4D?YP&+j$^{B3F tog7Wk6zr49aywMa(liCohtbX#hkXCaVMUcQ?gXdnQD&=`rH?4==3d zmk>+ya-rWpSx%C;(Iu1`e`#_y;@b-~AkTK} AodoP6xM!MQd$vU&%Y}A}t zRi*Q1ceWb1)>bF@Dn|4!%{KeNgB$Fgyljod#kO@vrx}wHOw7zIr7=Vlle4?`6cR*Z zVR^^)+EtMEsV(!!-0g`qU7hEEtn){fTYU+A2-P$d!DbIX6S;j^-<}KKzaIJm98{08 zR0e6g@RX(sw@4R2dFphPJe{l)EP8a9?Ke6xsK^K&+_ZNuz{wr{)_4s$zFi==E|o4R zUvIj5cXYb&Rd28zMEBA~Ue}6fjZbh|5yvX|uk82~TdXv<_O4bA8{d0VPx$&(5IO#; za&Z4mXM8MyADBW~V26v`XKPc(+0I`%#D%&}vV8Jo3zX`)BQTNs@|M<+`Dwk?YeCbV zR~!bz-zhewMzp;d)&Dfm%knNr{A@$39KUCz9^ShjqOhO9+AAO}sL~rNj7km^P=AA@ z#Ro%{L!RlD+yY77a&OZ^&IufuYcbP#L8LsHK(H=eIQPYS?ag&OKM+f*564!HwB^>B z1oT%(!}vD3PRLOcvg;g=rTt(emNnTFCQBwQAkOOc&Qt|WBOqMLf;e<^s3Td;7!TY? z7L=2H-q$R#R`fq~RT HV&WK_(V1mtLhI=2 zp#v8?u(s5~{s^8=uX=qa+R4?m!Ae_2wpL}#W$XSaI5xIIbF_}zs$7ML-xI+b!fV8I zqJeYrnJk+0Hd(|Nr*`$42%p(7^7R+@H}Gu=ww;VsU76^(Tm=dksw6cDU=co>HnmL= z`Nm5(MD7NN0Gj-hDJqz<`duM{w@-B#l?;M0oAz`?@TPiHW~ZoI6XYh-ys{oUP7z-* zkT9CG0cx~?|CPug0T-DuP-WO)`SZ3hM4oOosWd~>EV-$043V${y?jm?HraVTsE}{( z7rFw@|M kLNuMC@UoXHwqTzPF9!3zx&8BI_}YuW8!14I~WYG(*bPT%g? zatLTN@*Jmfkq?LCfOl3obqYL56@PDelNZ6$2|Tfi0oFe)%Mi`AAt}-zN;b8>BTqZP zDHaZKaj{q|jF*