From 55333bbe56b5be540b981dc1c940a334cac8dd8b Mon Sep 17 00:00:00 2001 From: borbitter Date: Sun, 28 Jun 2026 01:45:04 +0200 Subject: [PATCH] fix: begin of life arrow --- src/core/draw/sequence.typ | 122 +++++++++++++----------- src/sequence.typ | 18 +++- tests/lifeline/create-destroy/ref/1.png | Bin 8352 -> 8505 bytes tests/lifeline/create-destroy/ref/2.png | Bin 8170 -> 8423 bytes 4 files changed, 82 insertions(+), 58 deletions(-) diff --git a/src/core/draw/sequence.typ b/src/core/draw/sequence.typ index e4d485e..7982ec1 100644 --- a/src/core/draw/sequence.typ +++ b/src/core/draw/sequence.typ @@ -1,8 +1,8 @@ -#import "/src/cetz.typ": draw, vector, coordinate +#import "/src/cetz.typ": coordinate, draw, vector #import "note.typ" #import "/src/consts.typ": * -#import "/src/core/utils.typ": get-ctx, set-ctx, expand-parent-group +#import "/src/core/utils.typ": expand-parent-group, get-ctx, set-ctx #let get-arrow-marks(sym, color) = { if sym == none { @@ -17,8 +17,19 @@ ">>": (symbol: "straight", stroke: (dash: "solid")), "\\": (symbol: ">", fill: color, harpoon: true, stroke: (dash: "solid")), "\\\\": (symbol: "straight", harpoon: true, stroke: (dash: "solid")), - "/": (symbol: ">", fill: color, harpoon: true, flip: true, stroke: (dash: "solid")), - "//": (symbol: "straight", harpoon: true, flip: true, stroke: (dash: "solid")), + "/": ( + symbol: ">", + fill: color, + harpoon: true, + flip: true, + stroke: (dash: "solid"), + ), + "//": ( + symbol: "straight", + harpoon: true, + flip: true, + stroke: (dash: "solid"), + ), "x": none, "o": none, ).at(sym) @@ -56,11 +67,11 @@ let width = calc.abs(ctx.x-pos.at(i1) - ctx.x-pos.at(i2)) let h = 0 - let comment = if seq.comment == none {none} else { + let comment = if seq.comment == none { none } else { let w = calc.min(width * 1pt, measure(seq.comment).width) box( - width: if i1 == i2 {auto} else {w}, - seq.comment + width: if i1 == i2 { auto } else { w }, + seq.comment, ) } // Reserve space for comment @@ -71,7 +82,7 @@ h, ..seq.linked-notes.map(n => { note.get-size(n).height / 2 - }) + }), ) ctx.y -= h @@ -79,13 +90,13 @@ i: i1, x: ctx.x-pos.at(i1), y: ctx.y, - ll-lvl: ctx.lifelines.at(i1).level * LIFELINE-W / 2 + ll-lvl: ctx.lifelines.at(i1).level * LIFELINE-W / 2, ) let end-info = ( i: i2, x: ctx.x-pos.at(i2), y: ctx.y, - ll-lvl: ctx.lifelines.at(i2).level * LIFELINE-W / 2 + ll-lvl: ctx.lifelines.at(i2).level * LIFELINE-W / 2, ) let slant = if seq.slant == auto { DEFAULT-SLANT @@ -129,9 +140,9 @@ if seq.create-dst { let par = ctx.participants.at(i2) let m = measure(box(par.display-name)) - let f = if i1 > i2 {-1} else {1} + let f = if i1 > i2 { -1 } else { 1 } end-info.x -= (m.width + PAR-PAD.last() * 2) / 2pt * f - (par.draw)(par, y: end-info.y) + (par.draw)(par, y: end-info.y - m.height / 1pt) } end-info.ll-lvl = ctx.lifelines.at(i2).level * LIFELINE-W / 2 @@ -142,11 +153,11 @@ let start-lx = start-info.x let end-lx = end-info.x if seq.outer-lifeline-connect { - if start-info.ll-lvl != 0 {start-lx -= LIFELINE-W / 2} - if end-info.ll-lvl != 0 {end-lx -= LIFELINE-W / 2} + if start-info.ll-lvl != 0 { start-lx -= LIFELINE-W / 2 } + if end-info.ll-lvl != 0 { end-lx -= LIFELINE-W / 2 } } else { - if start-info.ll-lvl != 0 {start-lx = start-info.rx - LIFELINE-W} - if end-info.ll-lvl != 0 {end-lx = end-info.rx - LIFELINE-W} + if start-info.ll-lvl != 0 { start-lx = start-info.rx - LIFELINE-W } + if end-info.ll-lvl != 0 { end-lx = end-info.rx - LIFELINE-W } } start-info.insert("lx", start-lx) end-info.insert("lx", end-lx) @@ -164,13 +175,13 @@ mark: ( start: get-arrow-marks(seq.start-tip, seq.color), end: get-arrow-marks(seq.end-tip, seq.color), - scale: 1.2 + scale: 1.2, ), stroke: ( - dash: if seq.dashed {(2pt,2pt)} else {"solid"}, + dash: if seq.dashed { (2pt, 2pt) } else { "solid" }, paint: seq.color, - thickness: .5pt - ) + thickness: .5pt, + ), ) let y0 = start-info.y @@ -208,13 +219,13 @@ (x1, start-info.y), (x-mid, start-info.y), (x-mid, end-info.y), - (x2, end-info.y) + (x2, end-info.y), ) if comment != none { comment-anchor = ( - start: if x-mid < x1 {"south-east"} else {"south-west"}, - end: if x-mid < x1 {"south-west"} else {"south-east"}, + start: if x-mid < x1 { "south-east" } else { "south-west" }, + end: if x-mid < x1 { "south-west" } else { "south-east" }, left: "south-west", right: "south-east", center: "south", @@ -223,21 +234,20 @@ comment-pt = ( start: pts.first(), end: pts.at(1), - left: if x-mid < x1 {pts.at(1)} else {pts.first()}, - right: if x-mid < x1 {pts.first()} else {pts.at(1)}, - center: (pts.first(), 50%, pts.at(1)) + left: if x-mid < x1 { pts.at(1) } else { pts.first() }, + right: if x-mid < x1 { pts.first() } else { pts.at(1) }, + center: (pts.first(), 50%, pts.at(1)), ).at(seq.comment-align) } expand-parent-group( calc.min(x1, x2, x-mid), - calc.max(x1, x2, x-mid) + calc.max(x1, x2, x-mid), ) - } else { pts = ( (x1, start-info.y), - (x2, end-info.y) + (x2, end-info.y), ) if comment != none { @@ -253,14 +263,14 @@ comment-pt = ( start: start-pt, end: end-pt, - left: if x2 < x1 {end-pt} else {start-pt}, - right: if x2 < x1 {start-pt} else {end-pt}, - center: (start-pt, 50%, end-pt) + left: if x2 < x1 { end-pt } else { start-pt }, + right: if x2 < x1 { start-pt } else { end-pt }, + center: (start-pt, 50%, end-pt), ).at(seq.comment-align) comment-anchor = ( - start: if x2 < x1 {"south-east"} else {"south-west"}, - end: if x2 < x1 {"south-west"} else {"south-east"}, + start: if x2 < x1 { "south-east" } else { "south-west" }, + end: if x2 < x1 { "south-west" } else { "south-east" }, left: "south-west", right: "south-east", center: "south", @@ -275,7 +285,7 @@ expand-parent-group( calc.min(x1, x2), - calc.max(x1, x2) + calc.max(x1, x2), ) } @@ -286,27 +296,27 @@ radius: CIRCLE-TIP-RADIUS, stroke: none, fill: seq.color, - name: "_circle-start-tip" + name: "_circle-start-tip", ) pts.at(0) = "_circle-start-tip" - - // Start cross tip + + // Start cross tip } else if is-cross-tip(seq.start-tip) { let size = CROSS-TIP-SIZE let cross-pt = ( pts.first(), size * 2, - pts.at(1) + pts.at(1), ) draw.line( (rel: (-size, -size), to: cross-pt), (rel: (size, size), to: cross-pt), - stroke: seq.color + 1.5pt + stroke: seq.color + 1.5pt, ) draw.line( (rel: (-size, size), to: cross-pt), (rel: (size, -size), to: cross-pt), - stroke: seq.color + 1.5pt + stroke: seq.color + 1.5pt, ) pts.at(0) = cross-pt } @@ -318,27 +328,27 @@ radius: 3, stroke: none, fill: seq.color, - name: "_circle-end-tip" + name: "_circle-end-tip", ) pts.at(pts.len() - 1) = "_circle-end-tip" - - // End cross tip + + // End cross tip } else if is-cross-tip(seq.end-tip) { let size = CROSS-TIP-SIZE let cross-pt = ( pts.last(), size * 2, - pts.at(pts.len() - 2) + pts.at(pts.len() - 2), ) draw.line( (rel: (-size, -size), to: cross-pt), (rel: (size, size), to: cross-pt), - stroke: seq.color + 1.5pt + stroke: seq.color + 1.5pt, ) draw.line( (rel: (-size, size), to: cross-pt), (rel: (size, -size), to: cross-pt), - stroke: seq.color + 1.5pt + stroke: seq.color + 1.5pt, ) pts.at(pts.len() - 1) = cross-pt } @@ -352,7 +362,7 @@ anchor: comment-anchor, angle: comment-angle, padding: 3pt, - name: "comment" + name: "comment", ) // TODO: Improve this @@ -360,14 +370,13 @@ let (_, left, right) = coordinate.resolve( c, "comment.west", - "comment.east" + "comment.east", ) expand-parent-group( left.at(0), - right.at(0) + right.at(0), ) }) - } if seq.create-dst { @@ -384,10 +393,11 @@ if seq.linked-notes.len() != 0 { end-info.y = calc.min( end-info.y, - y0 - calc.max(..seq.linked-notes.map(n => { - let m = note.get-size(n) - return m.height / 2 - })) + y0 + - calc.max(..seq.linked-notes.map(n => { + let m = note.get-size(n) + return m.height / 2 + })), ) } @@ -397,7 +407,7 @@ c.last-drawn = ( type: "seq", start-info: start-info, - end-info: end-info + end-info: end-info, ) return c }) diff --git a/src/sequence.typ b/src/sequence.typ index 5c707f0..cbf73ac 100644 --- a/src/sequence.typ +++ b/src/sequence.typ @@ -5,9 +5,9 @@ p2, comment: none, comment-align: "left", - dashed: false, + dashed: none, start-tip: "", - end-tip: ">", + end-tip: none, color: black, flip: false, enable-dst: false, @@ -20,6 +20,20 @@ slant: none, outer-lifeline-connect: false ) = { + dashed = if dashed == none { + create-dst + } else { + dashed + } + end-tip = if end-tip == none { + if create-dst { + ">>" + } else { + ">" + } + } else { + end-tip + } return (( type: "seq", draw: sequence.render, diff --git a/tests/lifeline/create-destroy/ref/1.png b/tests/lifeline/create-destroy/ref/1.png index 18028027f77ef3449e716d06978a598cab2e8bc8..fcd7a67c00f7f0605b0feb7cc0177abef0485183 100644 GIT binary patch literal 8505 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 delta 7242 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 diff --git a/tests/lifeline/create-destroy/ref/2.png b/tests/lifeline/create-destroy/ref/2.png index af4775b6b8c84a94fbf49e9f3189992490461bcf..88a726fd8f961fd907c9320b7a68ef6b05bedc4e 100644 GIT binary patch delta 7351 zcmaKR2UJr})3?$R5JJER5rYIpnh40B5;~y?hzL;;5h;pD6GD}Kg@B-lMyfO^q98~U zsZva6(z|p*?+}nK?Yr=N<@uiTzHf4J&hG5Y?Cfu6@6PXLUU>#fyhwx2$-i`p7LbXL zmQEF9u8s|SZybTJ%Vg1Dl7QO_>imE|Qtd+8^k}?F>r*KVb)Qkq(9a7&^Py8iUcsS$ z$tN|4$xRuTt2k2)Xt`=a&}Hpaqa^?9$Yv!1wfaG`@66CrwW15vx|`syqCZ92-~UH1 zF20IHIB}ltW;fyVX_o|Dz1A#Y;MucV)zxg#4OOoR_U;CS z7~cnuE#p>`t5+*O*VzhO5IAm^Y>=_We5XM_f2uu*;D=G zkMIb*2lRX(%S##J^?_Himy}PCd?v7&Ffeu?Uot?e?S=-~hY%lfKYx{3V3h1Su zJJt?|)XvUsH>FT`^gj>L-!+uGed=C-dZezEb7Dkfq!9~4_1v740+f{|S&?;l5#?fJ zvL_KyI>8Vdvbgyy69~FYlZ1e^|^JHtafW3D~Z@U z^!9aR^32|*0qch(${(w|FAc1$WWtHbL&bUOIKX~&d-Q$C_UROf?5y3IuDLmS1H8xk zcYI$e5A1TNgjEmKdo;)DKOk9I%IpS$l7iu3VYF}SfhYOpMy95>!qp#!7W+MZToe`c z^wQk&@`R=DzKYRX#lFrzYOx;@Od7ro&)C&eob`Y|FW(&9-oE`bJM_Guptu*czch&` zS&exfHK-oO!V>WTxnX*Jj)BuSbP1xX9v>A*G!j!d~FLg#Rc@VYEoR34p|^hM6FJk zl|-$jgtt!urvUGqt7z;VQO6h2b|}%m7^5%9uLl^2Dsi%&3ZlOIHHhDK6WxkB>={F| zZ5d3UVeDgQ*f^RE{QZATZQkO+ilQPRHV7w&uD{B24H7o>bF>zpmDRF#4K_$Mw!zW} zf#S1u_uBtjawl&JDk`Qd5gTm;L#4gAEgUtz>Y*O~3HL?k6VA>}6ZmNJsQSXPrXmLF zr63kBYwBqIY^(q8-|64KA8iW5aBAO-zDo3O^!Eod1>pkzQ4mRbU&0Lww##mvS&P-Z z-qpnwrL&*=@pdKyB)BH{5Sh4q(D+Ig$^7lE6Ok*t#mdaYM3e*2^5GY_li!zRJZLBy z(_;0{E(=84d1wEirw3q3(Y^oLSTV6}#)*h0&i4-uB~-7bK0rw#ryq!N!q{Or#V%{B z)DDjyn396EZinIt^ccG5pHdS)kL}M7P(vd{_p%L9eBjr3_WJfjk4^4 zLKq=0@x-)AbGbwpOoHY_reRh+_5y0r2-4Q7!%)39GO`AQ=Dv9|GUv)#R#x_RH}~N0 zkd^nhDk=#}#?HebiF&z22kY6oB)|4SZ%^~lft}unh?~R1!@jN8u?YC20u>G^K zcBP;co-Gd*J5n^8j@94L=roZo-#xFRqod})aZ{&}&ONL*XV||AHT3OqRgzg=W+sDi zisyLEnVUDw%nyyPU%zW$P+D2JKUTek?~eoGIAmlT(a!Fh){aRk?y}pn|}{wVF)9qgkd^DNu>ou^n_xb4TA`o zhDMbaY6PRvm~OtOlZQe8?CifgItY1=LmrKdjZBh|tSb!-vCYlRD%JjB>W&D{`pW&i{e6EH z6|}79A4@dn4*vH!83%j+=U5@7xXI(qj%*}V2e-MnteLm&&|H@>_h#v{xm1awE8>ZL ze_}E5rdFHI~Y9)_?y5;1`gug=0L~nKXJg~E|x#EkUyV9zP`P^MlFhLnPcrMe_ zWVd2&x6tzOqpJ-0!aU_lZ34zFVf;t211u+(gO`)8%ox?J4 zPvL_wkD|h!ZLz#K9bAApSb41O>?hNqzEt*ar8}G3+ujm8Pamm~PcjA3L~$Ur@u?IZ zP3HS4&-2a?*ykFYn_F5Ei-YC*`fi;PzWr!sf5XkmwL37dg=fmjM~U+Dr^=&86J)X~ z_}pz~_afe=VvX$W7ujfhCnnzB;CImg(#|re3B1r(#@0Cc9mq;NpCzqYdrWLpKEsqx zDgOB3-#L9MG*pZjxx8FymtX!BO8J`oQlIaI)sv*LV=|E6O><@9Tdo47#@SvKreAIgBbeBHPzcBwg2PP*apa=n z;d$`#37eo;OWI1u8^Rz_2{?hf*@gxE_VXdaQH_J!oOD>Q>x{`rll9n2!?7+|l@<;z zsRAj)rYSPTLzDw@Mj4W{P!Z9P)?uC2H3zMsg~^$Tz=UmJnoo-d{i@7FW7c-|E<%R! zPWqf<=G{I@R9Cs$hgV~oob*xMm*kLAiFykgW%b%l`Y&DEnb;t;*q4Oy(N$T{$t%Jp z>np-I8k9K^3FFC_Us%v+G8rQXz?Q*vaJ{$Js&&($OE|Mkj1^cIiDcOls*PzUt#pSrU?`2a@nc$)ui z{C^l8UmV@s;yKbMMdmgY7OBPKeuQm?qS(%#XYB0@KZB z_+WDn((q#gLD;+x_nzn0(_mm!DJWeY$%}j-?X&DYSc^^kNU$)Y03PaNEq68%km_P8 z{I%&8A>Ui{*d~Vjwznrft7>tW6w37k`FzztY#g&}#2-8qJ^c_Cp!go4`inn>lQU?% zN0l`Qo(8FymD(3jS2eg!!(u;Yv87+3E2b*;>Fz~bkZOv^_jX{Z_SSCxxA9FEik@3T z>+81aZ-MtJWi$3x&P}(xk59aJ<#rPmtaNB5l2yhSI5)c4xv|rsj1VC>EQf+#Kr}+< z2Q8L)_)ux)7{Oc6089u0VFf8p(bpt;vXik)D<;Ehv)r+&XGz!I-EZz;gW*PJLLW0d zri&HhN2Q5lfDCr&Uu1V9`GRgd#& z#zyZTax~hTV&xO{L}RY=N341bVRCzHSKZ;T@LcY0A%y{N=kHs$)%4{G7Rsia?{VLy z;o<}fLNt9HHc^#@v|;z8;9fz$E2_Te>BI#TAAm~xiSfXfau)N00yMj@>NiX6jZq_R)hKpApF$)oT6ro8r(jOhG!I z$N~_E&0UmhA%mD%mA2yVD%MQG{LP$bxdv-V@ZnJO^nUauOvYyIkg^s=%g?EOx8~O& z7f`;iwfhMt#1Se4KPrGhoE5Hq^BYjNS4t`#T+-!_(D`&!Y0`{>@(VZPe}&agcvXDR zOTW@Y25Zzm9|;lx=Re;lmqs$bs!ioGtp1nKlwXsM$3~-Qqqy~6$B_mg2KpNuXN%J=jkJ8|4%Oh1e%8% z0U!E_jU`uot{Mli-RU6h@Bn^WBmtTLvN08r39R{oG5gGqhO3^%_G4pJH{xg9*qfG6&0qC z9>%wnL!uMVXX?Sl4Cp7c4sNSidK*A)&&jm0+m*|Xb!bI6jJ{T_j z@GNA6G^FpZ%yAy3;*}pdOe7muzDoXUU?%IC2p%0Rgx}eg%T3bqQN|fSGyx1Z$e+w2 zI{)R8TtG93HtxC1FS#IzfWPkVcR^Hym=OUW1B9uL-G|p;$)w?V&-FLDDX&LA{<<c^%?)NRIdmKO3pVQaP3W5k_@WNeu>B*-p^EJa%4PS8sa)2wz%P`}Wz zu;C#Oh0Fo`+~u#xS@5Aw5_kS5I=a&>^2fQ;cmgEz1 z7NVOT7wRxtn;dPzb5X=InrM^VvyqSz4?Oa)v+0xpmUN*ZG%hh{1Mupa7Rg`rKFXBoO6|{ z9@CGL?oVCyFv;!hn*09v-qE0+x<0oVM(}35J;hvHkR#OAhy~n_1~X`;-p!kBt*w)X zX`x5Q1BYbmj*vUU1q@uJdwXa>^;3(0(qi6J7jQ1@KMX7Ky6RPEB=XS3zV&HQSb}V# z=5Gla3z6vnEqxAXYe$~cI6CfSiD}JBShD!zfMy5!Fnxi6czp{XAVWqpRc0=9!BpEE zn{}OMnA$|xo>5sI8>@C2aIXXNHmX4ag}Tw#By#YelR-e4Kiq(Cbi^*MX#>uoti zm}b7o7@A!vtLJksWrT95x`RCXE;~24gsHG}M@N`@WKce1lsT;{iGe}1Zo)~#7!wlM zJh6&oekR13hta%trr*BkLb^Nz5-b=S_~E>hQW8+#8AQ;^bCu(+R>_JtUX^5HM50;k7sEszlnsttTd=B*(InP^dz zdcY<2mwN|zP(|KOD!#>}zhH2wtLuA$V*A`WESUDl3+5PJJREF=jG|HMcmQrNX0GtT z3OO^GX5q6ZjM@ujgO-0cI-k)qP+A&%r0K;yG~BY<`&C3#Noe2Z(L}bUOCr3p)A{cV zHQR9a&!06ecVe$uivHT)te)P;#>>v7uQ+Wj#+)#F)B5s--^S;bIZms7{=EDXiwT)^ zYoGJMLg!{nR(`N>alI)9iarSW>3(vbpP!G5)BBxAh;5$HpLKgQ!KfP2;i1gsTUEH> zU^8dqyMHym1n`z$o7pWan->UdZbpuQ@vqDE4PKs`pXUwCvtNukCn=Nkm(*HXA%U!O zD(`WhQs9iMmbWXaL)l)EjlywRy~F#ne;U$nB)W7v*PaPKby^6}JS*ExoQxc@K0Qv8 zvMu1V)?KhMohLuI=U2f=T^pnh53c>DuI+uG6n{wL%PxNM@S(e#o51W=?WIdrJ{&)M zBfLeTl{|DmGf`#=i>7NXW@mHPV8_w1NzUza3Jr~o4@_LO_`-{%n^;kM!TY57d1E#R zD@=5>p|y3**AxcSi#ic8TGL6Wb-t0lK7?`L)vHWct@T8L!`4I$38eDaX7Ek0i-(;2 zZq@6mQqP@O0;cigj1V01l3?jqgN<3hri46-?eFUgaD8yE|KJV5`Rl#V}A~UjKf@3-59^Hf~Uyh%pLXU27rT zwhQ)h+uOL? zwDYcBUjde{NCkP9M`!hg?_9eUlR(%$ttGm!;Ehyus>^lul+?L?H18r+Hsp1XaAR;l zGF|I3l>!WNUQ<_}->~t44xcCuqaj{S%glGEq4EV1{6aG( zS{ltkOX1~Bv9K6>@PMGeU@MW(-d+k>p!@j*kc=x|z(x)#{It4nb>_m+UTg-V)-5l> z4NXmJMe*e5j-kYa%A{|~rmL|r#x~S@a z2ct+_eDH(YHHKOH{;z$mxpV#2F6jc_-Z*E$LDq0DUKS%YwYu{G{v-AZhj-JNriVV+ zF72}uH2zOmC_#De2yB$AdLmIkX6^XhZrR1Io-mZ<#UP!D+1Uq||AA6}G0N%j0gYFE z7QA3_v|e6b`a&RQN&fm2B@!iEBeEf7Hmg})mt5!uV^?-gJUuJbWv=$>?*->AXX3Zc z!t0M_#>ZtS+=m#w@9Xc^r6BX%V4L(jC4o@|J`!k~r+OfAX ze=4x3dZ{AR>_&`AEUKd=)fxPJP(+RXx zi@(1=f$(hO!E2*Z_4@h;uz6Y44+jSezpgdknx1sx7)N$Fdl)4b{cN4KqKjl^rDPfc zai(Rz65W&_U))y4w9^KFa}%qQVMAKFEs5#6YDKx(DyP;8b~cTdn>4p2C+AfNTAtCU1K=i|(e zn9yXRH1h{O8)Ek~F(9@6d-v0E?I>qZ{d zy@p`B*Yhb?BgbJiI&9`yl$a<%3x`$7^Y2-r;b@mE$ zAeW7Z0qx$hgZE2hOO0ZPwaiRTg~=t1I&$kwUtX>#lnZRHP8C$hX<1nn^m_n%o?_hg z(q?b!A9=aVtd(|nj5q+!RVs)}iF#XJ6>&MR@K1B=cH+nb-!b9E``P1$S?69@#6@7< z5Rwaw0%gxzC>?@@qINhk8x~&CV2R6>@v7*x-T3l67w5USMFES?xU3B?MO0->6KkRI zejO(?!2Qc@t}rF{ABm;&XwJha=Tdv=_zdFauCFmNxSF@Idd~G5E+XlqY((Bk!TzkP(v?D2mxu*n~(sCp-2@XMXE>@q=t@EAv8gXbVZudlqMogKnxIi zmm(r9^j;-M-5cNiX6N1AfBR!+c4snA&OP@$rNE>Ge+G@qFDZp78QevxbsKtOuIF({MUejmg?M&gKHz@lDqTV%q1Qr< zK$-Y=^SLpRl=7aN?88bAWKAON{O9*(eV$~soNu4ZbnlHJN!ZB;{-=xQ03V4b?QIb0 zf4?M_4B9hN6Dr3CGj_TbT+%dXOiELkmSOut^EN@w8&4X~WGQ8jk2&zKF_?H$(^8Fv z$93{{bh4C<;qzcyJl5xM!xu-5nE zPGx2HkMl5ld+`$+)qha;i-kqX_SHdlc1x?jJ_D#_7$7JL914DeL3_#i`W-FIa}Oig z!??Y+*Voqu2bcKG?={E8x3skASRQUDP}eq?U16L- zmvI>SlxvhpMJ`zYUK%%I!K7kY%@xfbRYj+pqMs|4$@3%Eo|2Ji1;wi=7eo4qx&5}7 zi&0_jB;J9x%5(G$_+3h4t8sCV*be62is-GK&K1(Qs*0u9a|NFc1fj0qgHnDeZS8Y; z+Jp+C*8W~16R7`nU8|PUI++`a9+dCWh27m%5U=$2Ng3(VE9~3)evfQjLz9rHa6YY# zQ0w5~<2&z_kr}eM17QU5bpC>W|9P?%cnqeO46(i6z5MEi({~+7iBSW6h?<7R=JfQ^ zMoq9Q4m&d=Uik=TW9Ry0C4YQfOvJoF`Okh^I6Npo&B&-Wd)fj@!#Wd#jP!9T!`7~i zSK6s}f);y*@&%2IjSk~@K!rNlmLgA6dInZB|7^vbSV1OiyLJ73t=RCZQ`deD&@VH`p4xE2niLg1@-P?Ot!_O;GPk__X(#@^nqTBX-r-v5!>V8sn zbq2g++odPn?Y?Wk*>BV$+togA9QNMZP`6LEG=Q|5o~K7%UlQu-{yHXbEb?FCgV@a5 z+PN-za{F%3Lu~dpCo`HH9M{Hj2EKjkZnt|nLe{aoF&S?tw=lENEh9#;)ECPF!XZ1M zsj!EJUmo-+cyIn>V3x-H-Yt44zNX%ToJnsIFb!+__V`;+=QqOiw5!M=K1Q00PtvY$ z#UXfm2J1H`Otj>5xvN*jG!q(Hu#@7uJiu9qp9!O4ARSE=p6I#@3*uKZggz`OmrrB8; z61Z4AG7_1?y`CXy2Ti}Gs5o#X+k_ZX|0sTPHgs7t_Sc$+grsC<7zW-{sQmzjh*0Y& z%&tyYaX;E`ayma_5jiO@SQNXL9JiBkE9EYo&-+S|h=#*!e%^qYZ31h$aYd$X#{$)G;VK8*v6>+|hHl{|w3^?8m<<02$^(R2 zcamK;d&w>CCBFOPD}RK6A$u$#nS><8Z%E(=>95EP|D}3TrRw`X=t|t*wMg9l+-vXwythc6K-OZpjEbTI?5z&+> zh4UkxVmLV&;-EMCE=0F|2c4Ykbyp*zcn&-H?7TPLe+~O&awkN1dg+GaM}CdB(WARO z)Pu`{N(*KN2JGU@eDkpPMMYmBF|nC4{s*ty*#`$Jl@x=p7!EOddUI_}&GNFcQFcMF z26zT$`@yqI61uc>9%o__^kWfrx5!?uOT+t8>F1;&r|2Zv=op`yds??|e??c)Zfws6 z(?06#9PjdfEc292JN)Hk@aH$1KkJgRvdT<>pqj;F_EQA-`K5L8xJ`DOFX}m=2c9Qc zAWWn=7K)@FMG3L#j5}J_(8W)5e4x4nQMV)YkV_0A&)F_6FN?t>0%oUU?%rhy8H?nA zzD-LO=heQ{GVsU6<>xR^>!u)+ZAF5=ZwlS5f3hbXS1#3~^=ikG%6;6r{nd8n z1+qKa*FD8)iK*l+1{y1yBg_7{N>oC?lO4DrN6to zey-u*j}ReH$k=9FgSADKCH?5g>FKdYLV-UzVYD|hh&BV$5Usa91!)LA4>C2)a6te{ z@qp=RjGJ!N%mo;abIi^-mggIfBt4bvz7nm|7RT-?&pQ$k*Xwj+D0N(7@W*z*PWY^a z$&b~oPUPtrw;Sps2=t8Zg4{YB>a*UWWpts3^oC?}jCJ?(mjuv^+UJ8kwonh}`-`OY z0|V;w)@&@#Vjoxpcm@VuD6DtuEj9IFjbUTUcx)cLG9-h~;rIhNuk+kh*zi z_wk00qo(&&&=!|iT2>bFos#{s4Qr%*3Cj3)+R#v-vi|cMdIeg=?|v6oOr*c4i0f`{ zAAH;HF5wD{fYiH=ANcFYqvD-GNc9hR3+%reKw3MjAwuhd z_F!1V4G6MR!sBKHl>3IAkydV$tvRQiezV4?XDh_g)*K(Y8w12pm)IZZ0Y?vPz1g^VHo23@UZ9cf%D%}u^r1M<8f(DJdZV0f#Ncs;a6NFJ1(46t!O{HE%Q_cA*uzuKxbuwNf&}*%>^p9Exzy zdwZVo>J{~IKwzN1d@`{g4Ovs3@9eK!?4!XpG&C0#8E?>d?JeGQYWe#0w&01e8|oJh zNaLF(XNRRag#NHBYJlN0)HBfLbxuN<75p2x(rINm=a=1bgQ zmE)Mp+wxL~dYSPk;1@N%3$`%s4+x6W=h$~?*dlX zL>_ZjdB8FKC+rdi={+XAcia%zwSD|_J9tkW4+B(4z$Estc%TyDMLv#==34~+EhHrQ z7()-jVbkW`!HZG;HkHym>3?Y%0K zyNTSoFUT)J1I`O@B#M)Pug0UEI1EIy~% zM{Ih>7ZTrIWg@Ij54g@x6;xS0;aoHE%SRWYp8%HSB+fiw3Z6V!1US15oDv7)Jb(kc z69*)MAJ_!^Fg*tj=mEk{jl{E>vnU;isQ|;FQ?GCwF`=nln3U9l z3}4LI;A#4yW2M6YV#>i(r`0L|Jb`UQhMyY4FhCTXMQ3y19RNe3xB)}f9+nskAiNa` z2nTK>_<<-vk^u^^24o%v+7M+1Av%x*UN-@AOXpE zz*T!VK<7ygPxt>~xL>X=a0TsZ$&ww$1JLcc-G>zB$v)rf_Bbjrn zrc>~?Yspiq;qEP2*$vybzlwBoCT z(FZn6B4%m~NEhoWgqV#OG{E{bkN=|psEzTk2XzWZ+@Wk31~~Jm!PV}0qb07+!S--r znBujWXA?oeJF{c`s&;ERKek&^+E+zs;IptR8##*GrCxdu$f#T7mai2_@7IJYHX|j* zu%c6Z9N5PImKDb8BzGnD$#*JHr!vTZBfB9z7cKY#JeOm#d5zUf`=@j~VixvtEk}D+ zusBCZ?twrRN*IJ}Mn*r!kcDdo6cwf}Q%XG4f~(P?(Nm-!wR4~61i^aC37!{!IB>c7lxMDB@vn0lF z$f$Sfs&{=43j;W@4%~NKg1U{GLfDJ34m;dvchh~RUp#_efkC)E*k7y8Ldb)^cvOz} zEbYD2;(e)gL~xS2D$gE|*XKESwKHgY76$0khOJjPIN23u#}+~ zrg<+oayKjWN8Z?)L9xL^b>(=;jK$l*nPVWRHqn?Eo#!V*Gn2EkvzwcnKYqL-qa%7z z0^G%L&7IN!o)h=|xylYhCun)1ZlkF{w$$ewCy_)Y z-e8gj54RM~hG{P?3nPM7h1nFxWOnkfe7 zUe^Ou-St~f{!=ZDuJo_|@*8m&soq$ZIoRamE`^iKz=y|k{MR9|6mns--6_RJH#Rtg zMj;p@u|({4&KhmHIC^8(A|Z*=GEF2TL?f8nuKqI9;9JUK3TxQ+^!ljC8jedgF!}F( zD>|n^Pom^$n&UY*p#9VRc4GGM<-OlV3P3)^s{3c=w0&+4-dJAlaH#V3_NJzF11x@Z z0ZY?w9$sL+td?73CUSgwHZ?U>RwhEsGOD4U;`Ef{t=crPJfnu!)4CCmxXn!$4E8CI zrQFv-@h2Rh8{QeqLpwVaI4io05uyv{6;b;9j2iig2icxGCqPv=sE|8`0$rR8$q(?P z4f`kPAW5#2i{ecRQOtVy95Y-%d4G(?-Js(L3CZ(TMol1{se=Q5M-b&%FLY-|)?^RE ze0e~Q*BQ6!pa8q^>m^)8X&3`)oM1mto_V}E+m2#o(Vku?Zl{IcKy?o58W30{!Rw-J zNQVNT%gIA&G>s)*mgoz-hva`-QRAjBbH%e&jtf;Xf>y42$UZndtzl+{#>Y;kZL_k9 zfiF*9rocET#o(-XzkOgWdiD(D1r2%m^7of78IShtxn5X&#=};!CpL^t{DRzelyLZI)Vxj>555I{V>xmh-Ort3~x+&-Vjlie>f@4eK~ zQN)cAgZrwU%r_6?kVC>5y#@SR88|EsS2!^-;V=m-!1+4WhE}WKg}qeQADUt>S^8%( zF&H*B*PGCI69S`(o9r0(74rJYipt8CKO}DlYnwQnnL&nzlOk!FrT*sSKDH{U^&shq z#Qr7gRbngpXCq2v1Q+NcRCYu~C+zGv@H4@X+3ohKsxc3bi)(AHXjlTRx)yU{* zjXyy=QT~SOl>5btY!)O1g-da%n70cv{HzTNGd(Y3LavN_{mPm~W@$;s!@~q84CNp9 z^z_iv>$cQF8Ul|O;@Bf`t*s%PdS+%`NBgmJ?V^NzEnB;#4;2*(KAX}zXC|LLFAOBS zevKb=M}LAq{=(EiK2=vsN>-9Bj$8osSs1{Cg^S<3i4c--{t@c6<_$g$sz^)Y5HlJr z8K+>mE?E3m^x+{n{Z@G_8-b*1ej(*w`sFRmWZi7$S1&x43_6RsNg&iWQ!}s)5@~Ki79-rv$PTiV@F)Y8;{Qj^n z(-1J}XVbY9DzBjdTzr%vlRYa63QvFf=c9k>UOOVEN`{5=O|s zi|6k`T0H)%=PRu=ibt%zt&Mk105p3y%eXR?#NhqA$6PF-p`nT+BfYdD=uoC2i@`TH zXhjC7bMTI1P^IX5QNl|35OOd}SY$gRlL1+vrHu{sYYAEJb$Syvl#&vgk<9I@7(N~I zzwTey-Hld_HxEt2+*W$3Cz2tvb-_JEvhTJrC#R*wH+LY6fI`@>X_&8&i?5l&Jr?HY z{~}$_Y;sIOvbKZv-d2p}>89aL7=MuGtC&$&G3gED#%Rj54n*_DFi{u4i)*Qo`m%Dlni@H8z6RQ>{u?_R|Jxo1ZcBooJ!xKA8oU}AG#8ft{Xt+)%rbQWq zD5g(O$0#Vu+O0Tj*xqz9(krF$^e{Yi^*(qv3T^$Fdimpc=m%OR5EIDYVMWDfATm4~nBz-c!cLk_w4L>*c z&?tDH-Y7XK^1goSh|4+V`Ng7x@S;Q<oisLj{}o-g zWx%8dYITn5#aKah=(w77t4|4oW7Xo|Ak8ph{@urGpgMG}E-U3vhAgCSqz;MzJJb8I zT^tKZzHBDKBA|jp;*cpqa~7qeUmuCL1>~|FT#XssL`0o-z}pAb@~{z%ZLp7l2sNXX zt|wd`-UpG>+ULtqMn5eFIkyBC>_pKzkwMA)%#iM|XSZ0ED8Cj+9sj8{M53eclvc4$V}VV= zNsF7C_nC6^_m1J=Ye-phyGNl*{0%Lg$82nJtj7FKem|k|h{sFrJlU=Zu6+?!pI>~H zsi&G{*K1x~RrS;Lz8Y178fu@kV3wYsW0tQ4{_Qn?Mw@VK8_C0Q(oquyg&-dRbpuu302}1Y$W5HVdk7bHJ-G;PVymTL!=!;OiIhs-ymMgV5yE)Rrd5v8o9;6n?MsYcwxC zd)7f)RwmH<=-cWl%v4V#?V+gB0setmvPtRv4;~xda@nHFHk9x53nn&99+8O2TVX^lS7TC2|E%A2(^T;Z2Fsn)=_1WmT#RwjtNgvSUUKNy%rs8em(s}p z2)sI>?6jBC;FYAIIi-z6`w-H#?f8YJ r$B@WU=KNn>o`SEE{;wKGYuOKja@Ey%goOg1>q*pAw3W*gEkged9m34p