From 142197e848a863d13dd10b1e397a52b4aa8df450 Mon Sep 17 00:00:00 2001 From: Joaquim Date: Wed, 22 Apr 2026 16:10:14 +0100 Subject: [PATCH 1/9] Start implementing Bezier curves in custom symbols macro language --- src/gmt_plot.c | 16 ++++++++++++++++ src/gmt_plot.h | 3 +++ src/gmt_support.c | 6 ++++++ 3 files changed, 25 insertions(+) diff --git a/src/gmt_plot.c b/src/gmt_plot.c index 700c1f09c6e..71d2a76bc83 100644 --- a/src/gmt_plot.c +++ b/src/gmt_plot.c @@ -7690,6 +7690,22 @@ int gmt_draw_custom_symbol (struct GMT_CTRL *GMT, double x0, double y0, double s gmt_M_free (GMT, yp); break; + case GMT_SYMBOL_QUAD_BEZIER: { /* Quadratic Bezier: cp=(x,y) endpoint=(dim[0],dim[1]) */ + /* P0 = last path point, P1 = (x,y) [control], P2 = (dim[0],dim[1]) [endpoint] */ + double t, mt, x0b = 0.0, y0b = 0.0; + flush = true; + if (n > 0) { x0b = xx[n-1]; y0b = yy[n-1]; } + for (i = 1; i <= GMT_BEZIER_NPTS; i++) { + t = (double)i / GMT_BEZIER_NPTS; + mt = 1.0 - t; + if (n >= n_alloc) gmt_M_malloc2 (GMT, xx, yy, n, &n_alloc, double); + xx[n] = mt*mt*x0b + 2.0*mt*t*x + t*t*dim[0]; + yy[n] = mt*mt*y0b + 2.0*mt*t*y + t*t*dim[1]; + n++; + } + break; + } + case GMT_SYMBOL_ROTATE: /* Rotate the symbol coordinate system by a fixed amount */ if (flush) gmtplot_flush_symbol_piece (GMT, PSL, xx, yy, &n, &p, &f, this_outline, &flush); PSL_setorigin (PSL, 0.0, 0.0, s->p[0], PSL_FWD); diff --git a/src/gmt_plot.h b/src/gmt_plot.h index eacf9adec99..45553be1d83 100644 --- a/src/gmt_plot.h +++ b/src/gmt_plot.h @@ -54,6 +54,7 @@ #define GMT_SYMBOL_GEOVECTOR ((int)'=') #define GMT_SYMBOL_VARTEXT ((int)'L') #define GMT_SYMBOL_EPS ((int)'P') +#define GMT_SYMBOL_QUAD_BEZIER ((int)'Q') /* Quadratic Bezier curve: cp=(x,y) endpoint=(p[0],p[1]) */ #define GMT_SYMBOL_LINE 0 #define GMT_SYMBOL_NONE ((int)' ') @@ -61,6 +62,8 @@ #define GMT_DOT_SIZE 0.005 /* Size of a "dot" on a GMT PS map [in inches] */ +#define GMT_BEZIER_NPTS 20 /* Tessellation segments for Bezier curve macro commands */ + /*! FRONT symbols */ enum GMT_enum_front {GMT_FRONT_FAULT = 0, diff --git a/src/gmt_support.c b/src/gmt_support.c index c5e56ec4126..a81f00d0644 100644 --- a/src/gmt_support.c +++ b/src/gmt_support.c @@ -5784,6 +5784,12 @@ GMT_LOCAL int gmtsupport_init_custom_symbol (struct GMT_CTRL *GMT, char *in_name if ((s->eps = gmtsupport_load_eps_symbol (GMT, name, path)) == NULL) return GMT_RUNTIME_ERROR; break; + case GMT_SYMBOL_QUAD_BEZIER: /* Quadratic Bezier: cx cy ex ey Q */ + if (last != 4) error++; /* Need cx cy ex ey + action = 5 cols */ + s->p[0] = atof (col[2]); /* endpoint x */ + s->p[1] = atof (col[3]); /* endpoint y */ + break; + default: error++; break; From befd27d075c127742c771d3e62d588a6057f6ae2 Mon Sep 17 00:00:00 2001 From: Joaquim Date: Wed, 22 Apr 2026 17:56:00 +0100 Subject: [PATCH 2/9] Add code for the cubic Bezier. --- src/gmt_plot.c | 17 +++++++++++++++++ src/gmt_plot.h | 3 ++- src/gmt_support.c | 8 ++++++++ src/gmt_symbol.h | 2 +- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/gmt_plot.c b/src/gmt_plot.c index 71d2a76bc83..c710d3c7bf7 100644 --- a/src/gmt_plot.c +++ b/src/gmt_plot.c @@ -7735,6 +7735,23 @@ int gmt_draw_custom_symbol (struct GMT_CTRL *GMT, double x0, double y0, double s if (s->pen) current_pen = s->pen; break; + case GMT_SYMBOL_CUBIC_BEZIER: { /* Cubic Bezier (B): cp1=(x,y) cp2=(dim[0],dim[1]) endpoint=(dim[2], p[3]*size) */ + /* B(t) = (1-t)^3*P0 + 3*(1-t)^2*t*P1 + 3*(1-t)*t^2*P2 + t^3*P3 */ + double t, mt, mt2, t2, x0b = 0.0, y0b = 0.0; + double cx2 = dim[0], cy2 = dim[1], ex = dim[2], ey = s->p[3] * size[0]; + flush = true; + if (n > 0) { x0b = xx[n-1]; y0b = yy[n-1]; } + for (i = 1; i <= GMT_BEZIER_NPTS; i++) { + t = (double)i / GMT_BEZIER_NPTS; + mt = 1.0 - t; mt2 = mt * mt; t2 = t * t; + if (n >= n_alloc) gmt_M_malloc2(GMT, xx, yy, n, &n_alloc, double); + xx[n] = mt2*mt*x0b + 3.0*mt2*t*x + 3.0*mt*t2*cx2 + t2*t*ex; + yy[n] = mt2*mt*y0b + 3.0*mt2*t*y + 3.0*mt*t2*cy2 + t2*t*ey; + n++; + } + break; + } + case (int)'C': if (gmt_M_compat_check (GMT, 4)) { /* Warn and purposefully fall through to assign the rest of the statements */ GMT_Report (GMT->parent, GMT_MSG_COMPAT, "Circle macro symbol C is deprecated; use c instead\n"); diff --git a/src/gmt_plot.h b/src/gmt_plot.h index 45553be1d83..33ea45fd5e4 100644 --- a/src/gmt_plot.h +++ b/src/gmt_plot.h @@ -54,7 +54,8 @@ #define GMT_SYMBOL_GEOVECTOR ((int)'=') #define GMT_SYMBOL_VARTEXT ((int)'L') #define GMT_SYMBOL_EPS ((int)'P') -#define GMT_SYMBOL_QUAD_BEZIER ((int)'Q') /* Quadratic Bezier curve: cp=(x,y) endpoint=(p[0],p[1]) */ +#define GMT_SYMBOL_QUAD_BEZIER ((int)'Q') /* Quadratic Bezier: cp=(x,y) endpoint=(p[0],p[1]) */ +#define GMT_SYMBOL_CUBIC_BEZIER ((int)'B') /* Cubic Bezier: cp1=(x,y) cp2=(p[0],p[1]) endpoint=(p[2],p[3]) */ #define GMT_SYMBOL_LINE 0 #define GMT_SYMBOL_NONE ((int)' ') diff --git a/src/gmt_support.c b/src/gmt_support.c index a81f00d0644..647865af091 100644 --- a/src/gmt_support.c +++ b/src/gmt_support.c @@ -5790,6 +5790,14 @@ GMT_LOCAL int gmtsupport_init_custom_symbol (struct GMT_CTRL *GMT, char *in_name s->p[1] = atof (col[3]); /* endpoint y */ break; + case GMT_SYMBOL_CUBIC_BEZIER: /* Cubic Bezier: cx1 cy1 cx2 cy2 ex ey C */ + if (last != 6) error++; /* Need cx1 cy1 cx2 cy2 ex ey + action = 7 cols */ + s->p[0] = atof (col[2]); /* second control point x */ + s->p[1] = atof (col[3]); /* second control point y */ + s->p[2] = atof (col[4]); /* endpoint x */ + s->p[3] = atof (col[5]); /* endpoint y */ + break; + default: error++; break; diff --git a/src/gmt_symbol.h b/src/gmt_symbol.h index ce50e4966e0..3e2885a8609 100644 --- a/src/gmt_symbol.h +++ b/src/gmt_symbol.h @@ -82,7 +82,7 @@ struct GMT_REFPOINT { /* Used to hold items relevant for a reference point */ char *args; /* Text representation of any additional arguments */ }; -#define CUSTOM_SYMBOL_MAXVAR 3 /* So we can check in the code if we exceed this */ +#define CUSTOM_SYMBOL_MAXVAR 4 /* So we can check in the code if we exceed this */ enum gmt_enum_custsymb { GMT_CONST_STRING = -5, /* We have a constant string in a conditional test */ From 0a61a7d099a5e06d9f6bc626dcd59d5e88c55529 Mon Sep 17 00:00:00 2001 From: Joaquim Date: Fri, 15 May 2026 14:58:19 +0100 Subject: [PATCH 3/9] Update table od custom symbol operators --- doc/rst/source/reference/custom-symbols.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/rst/source/reference/custom-symbols.rst b/doc/rst/source/reference/custom-symbols.rst index 1e79b13c248..d1b1944669c 100644 --- a/doc/rst/source/reference/custom-symbols.rst +++ b/doc/rst/source/reference/custom-symbols.rst @@ -145,6 +145,8 @@ are constants. +===============+============+========================================+============================================+ | arc | **A** | Append circular arc to existing path | :math:`x_c, y_c, d, \alpha_1, \alpha_2` | +---------------+------------+----------------------------------------+--------------------------------------------+ +| cubicbezier | **B** | Cubic Bezier from last point | :math:`cx_1, cy_1, cx_2, cy_2, ex, ey` | ++---------------+------------+----------------------------------------+--------------------------------------------+ | drawto | **D** | Draw line from previous point | :math:`x, y` | +---------------+------------+----------------------------------------+--------------------------------------------+ | moveto | **M** | Set a new anchor point | :math:`x_0, y_0` | @@ -179,6 +181,8 @@ are constants. +---------------+------------+----------------------------------------+--------------------------------------------+ | pentagon | **n** | Plot a pentagon | :math:`x, y, size` | +---------------+------------+----------------------------------------+--------------------------------------------+ +| quadbezier | **Q** | Quadratic Bezier from last point | :math:`cx, cy, ex, ey` | ++---------------+------------+----------------------------------------+--------------------------------------------+ | rect | **r** | Plot a rectangle | :math:`x, y, width, height` | +---------------+------------+----------------------------------------+--------------------------------------------+ | roundrect | **R** | Plot a rounded rectangle | :math:`x, y, width, height, radius` | @@ -200,6 +204,16 @@ are constants. | plus | **+** | Plot a plus sign | :math:`x, y, size` | +---------------+------------+----------------------------------------+--------------------------------------------+ +Note for **B** and **Q**\: Both Bezier commands extend the current path from the +*last point set by* **M** *or* **D** (the implicit start point :math:`P_0`); you do not +supply :math:`P_0` explicitly. **B** takes two control points followed by the endpoint +(:math:`cx_1, cy_1, cx_2, cy_2, ex, ey`) and draws a cubic Bezier curve. +**Q** takes one control point followed by the endpoint (:math:`cx, cy, ex, ey`) and +draws a quadratic Bezier curve. Both commands are tessellated into line segments +at render time and integrate with the normal fill/stroke pipeline, so **-G** and **-W** +apply as usual. Use **B** when converting SVG paths (SVG ``C``/``c`` maps directly); +use **Q** for simpler arcs where one control point is sufficient. + Note for **O**\: if an **a** is appended to the angle then :math:`\alpha` is considered to be a map azimuth; otherwise it is a Cartesian map angle. The **a** modifier does not apply if the angle is given via a variable, in which case the type of angle From e4db698ffcb0edf6b856f59b049de0fee2559658 Mon Sep 17 00:00:00 2001 From: Joaquim Date: Fri, 15 May 2026 14:59:00 +0100 Subject: [PATCH 4/9] Update Changelog --- doc/rst/source/changes.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/rst/source/changes.rst b/doc/rst/source/changes.rst index 8163c775742..e2f8a502ab4 100644 --- a/doc/rst/source/changes.rst +++ b/doc/rst/source/changes.rst @@ -6,6 +6,15 @@ Changelog ========= +New Features in GMT 6.7 +======================= + +* Add quadratic (**Q**) and cubic (**B**) Bezier curve commands to the custom symbol + macro language, enabling smooth curves in ``.def`` symbol files. Both commands + extend the path from the previous **M** or **D** point; **Q** takes one control point + plus endpoint, **B** takes two control points plus endpoint. See + :ref:`Custom Symbols ` for details. + New Features in GMT 6.6 ======================= From ed694d94518176b73c09545b562ddc6486ebf47b Mon Sep 17 00:00:00 2001 From: Joaquim Date: Fri, 15 May 2026 15:25:48 +0100 Subject: [PATCH 5/9] Add leaf.def custom symbol --- share/custom/leaf.def | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 share/custom/leaf.def diff --git a/share/custom/leaf.def b/share/custom/leaf.def new file mode 100644 index 00000000000..eee32b9abee --- /dev/null +++ b/share/custom/leaf.def @@ -0,0 +1,8 @@ +# Leaf shape using quadratic Bezier curves +# Tip at bottom (0,-0.5), apex at top (0,0.5) +# Right lobe: cp=(0.5,-0.2), right side curves out +# Left lobe: cp=(-0.5,-0.2), symmetric + +0.0 -0.5 M + 0.5 0.3 0.0 0.5 Q +-0.5 0.3 0.0 -0.5 Q From 22dc5f2b3f767a82bdb12334745bba6f51894f37 Mon Sep 17 00:00:00 2001 From: Joaquim Date: Fri, 15 May 2026 15:27:02 +0100 Subject: [PATCH 6/9] Add heart.def (uses cubic Bezier curves) custom symbol. --- share/custom/heart.def | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 share/custom/heart.def diff --git a/share/custom/heart.def b/share/custom/heart.def new file mode 100644 index 00000000000..512ff2bd091 --- /dev/null +++ b/share/custom/heart.def @@ -0,0 +1,10 @@ +# Heart shape using cubic Bezier curves (B command) +# Classic heart: two cubic bezier lobes meeting at bottom tip (0,-0.5) +# and top center notch (0, 0.15) + +# Right lobe: from notch (0,0.15) → top-right → right → bottom tip +0.0 0.15 M + 0.5 0.5 0.5 -0.1 0.0 -0.5 B + +# Left lobe: from bottom tip (0,-0.5) → left → top-left → back to notch +-0.5 -0.1 -0.5 0.5 0.0 0.15 B From 564c780e705ae35504c37e32c61cbc014245ff0d Mon Sep 17 00:00:00 2001 From: Joaquim Date: Fri, 15 May 2026 15:35:39 +0100 Subject: [PATCH 7/9] Add test for a Bezier quadratic custom symbol --- test/psxy/bezier_demo_quadratic.sh | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/psxy/bezier_demo_quadratic.sh diff --git a/test/psxy/bezier_demo_quadratic.sh b/test/psxy/bezier_demo_quadratic.sh new file mode 100644 index 00000000000..667a0ab06c1 --- /dev/null +++ b/test/psxy/bezier_demo_quadratic.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# +# Test Q (quadratic Bezier) command in custom symbol macro language. +# Uses share/custom/leaf.def (closed leaf shape from two Q curves) +# and share/custom/qbezier_test.def (open parabolic arc). + +ps=bezier_demo_quadratic.ps + +gmt psbasemap -R-5/5/-4/4 -JX14c/10c -Ba2f1 -BWeSn+t"Quadratic Bezier (Q) custom symbol demo" -P -K > $ps + +# Grid of leaves at different sizes and colors +for lon in -4 -2 0 2 4; do + echo "$lon 2" | gmt psxy -R -J -Skleaf/1.5c -Glightgreen -W0.5p,darkgreen -O -K >> $ps + echo "$lon 0" | gmt psxy -R -J -Skleaf/2.0c -Ggreen -W0.7p,darkgreen -O -K >> $ps + echo "$lon -2" | gmt psxy -R -J -Skleaf/2.5c -Gdarkgreen -W1p,black -O -K >> $ps +done + +# Parabolic arc symbol (open path, just stroked) +for lon in -3 -1 1 3; do + echo "$lon 3.2" | gmt psxy -R -J -Skqbezier_test/1.5c -W1.5p,red -O -K >> $ps +done + +# Labels +gmt pstext -R -J -F+f11p,Helvetica-Bold,red+jCM -O -K >> $ps << EOF +0 3.7 Parabolic arcs +EOF +gmt pstext -R -J -F+f9p+jCM -O >> $ps << EOF +0 2.7 1.5c leaves +0 0.7 2.0c leaves +0 -1.3 2.5c leaves +EOF From a74f054da031f4b83858c2c8bc98e45484f01648 Mon Sep 17 00:00:00 2001 From: Joaquim Date: Fri, 15 May 2026 15:44:34 +0100 Subject: [PATCH 8/9] Add a custom symbol test with cubic Bezier curves --- test/psxy/bezier_demo_cubic.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/psxy/bezier_demo_cubic.sh diff --git a/test/psxy/bezier_demo_cubic.sh b/test/psxy/bezier_demo_cubic.sh new file mode 100644 index 00000000000..be98bb835c3 --- /dev/null +++ b/test/psxy/bezier_demo_cubic.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# +# Test C (cubic Bezier) command in custom symbol macro language. +# Uses share/custom/heart.def (closed heart shape via two C curves) +# alongside share/custom/leaf.def (Q-based) for visual comparison. + +ps=bezier_demo_cubic.ps + +gmt psbasemap -R-5/5/-4/4 -JX14c/10c -Ba2f1 -BWeSn+t"Cubic Bezier (C) custom symbol demo" -P -K > $ps + +# Hearts in a row, different sizes and colors +for lon in -4 -2 0 2 4; do + echo "$lon 2" | gmt psxy -R -J -Skheart/1.5c -Gred -W0.5p,darkred -O -K >> $ps + echo "$lon 0" | gmt psxy -R -J -Skheart/2.0c -Gtomato -W0.7p,red -O -K >> $ps + echo "$lon -2" | gmt psxy -R -J -Skheart/2.5c -Gdarkred -W1p,black -O -K >> $ps +done + +# Compare: leaves (Q) vs hearts (C) side by side +for lon in -3.5 -1.5 0.5 2.5; do + echo "$lon 3.3" | gmt psxy -R -J -Skleaf/1.2c -Ggreen -W0.5p,darkgreen -O -K >> $ps +done +for lon in -2.5 -0.5 1.5 3.5; do + echo "$lon 3.3" | gmt psxy -R -J -Skheart/1.2c -Gred -W0.5p,darkred -O -K >> $ps +done + +echo "0 3.8 Q (leaf) vs C (heart)" | gmt pstext -R -J -F+f10p,Helvetica-Bold+jCM -O >> $ps From 76f34eed329c443d9ed8b24986fce3e73bdc5a7c Mon Sep 17 00:00:00 2001 From: Joaquim Date: Sun, 17 May 2026 01:26:14 +0100 Subject: [PATCH 9/9] Replave grdmix and add 2 new ps baseline files --- test/baseline/grdmix/grdmix.ps | Bin 0 -> 39079 bytes test/baseline/psxy/bezier_demo_cubic.ps | Bin 0 -> 46167 bytes test/baseline/psxy/bezier_demo_quadratic.ps | Bin 0 -> 39492 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/baseline/grdmix/grdmix.ps create mode 100644 test/baseline/psxy/bezier_demo_cubic.ps create mode 100644 test/baseline/psxy/bezier_demo_quadratic.ps diff --git a/test/baseline/grdmix/grdmix.ps b/test/baseline/grdmix/grdmix.ps new file mode 100644 index 0000000000000000000000000000000000000000..4f2b7cb37bd661a0f556dd5763ade83b133b5405 GIT binary patch literal 39079 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 J!V6vy{l7ntmj(a; literal 0 HcmV?d00001 diff --git a/test/baseline/psxy/bezier_demo_cubic.ps b/test/baseline/psxy/bezier_demo_cubic.ps new file mode 100644 index 0000000000000000000000000000000000000000..18e0cb7711442833c5679591967edbf6bbde0aa6 GIT binary patch literal 46167 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 CZ*Um^ literal 0 HcmV?d00001 diff --git a/test/baseline/psxy/bezier_demo_quadratic.ps b/test/baseline/psxy/bezier_demo_quadratic.ps new file mode 100644 index 0000000000000000000000000000000000000000..ec2151665038621be3e3584b7602563a46bae785 GIT binary patch literal 39492 zcmeHQdvhDPk^kHL6i8idC8-=We29|ey1F{cvTP@orIlp+c70o_5jm1*ksL0Ew8d5V zTige}->(}_KK#hTO0JX*Js6Ic1h(hJ;6pL(cXNlRUykGUD{sBLy5idtd7E6GchSIv zIeR9X4Em#DTJr6wx$VuyrkYML6ICm<4?f4Z?cR2U_hW}s4^_UIjQnoP+nC5 zV6uSkmB~iMN7NRAk4)AblvUy0kI{Ash8Dzo z0=&~nc`YxeCIfdz)xZ|MHreH*s306t{06U8{z1}jg&wxAT?DG1%10-z?o~b!>Mqdov=}i>*n`*Rc9?^aHwG9qCHW`j zHaj`Ur^c3cXOjs=-@b8dS^L=B3Q$rPLVRIvg+2?nPiz-mBPH2IWp3XXyzZOVpF~VJ zaz7FTB|hh{ft(UKuR>PSW*wOmpSgbsu2iP1NYP1dZV$}CiJ^crj1ck6G&Z(dTb<2T zr}fYbX9H8;Zkb~XvS&8UZSr1kZf=I+Pi9h#p}rI`gAVT>N;~IlM;qDGW^8MFW>j3F z={*Oz3&<0LfroKAwk$yMZAd=Xq?9+zLCqK`Z|DQ*=S&@&d;%?#BFU5TxX5PE{snmZ z_BP23{pfShd4-{P55o@(JI-c!z;OaIL1Gv>`Z*4u?>c{{(#&4P1`evxL=SfTl>&iBv)t;fZ zt%h$(1fY&ydx=QJDqKimGZ3(zQr=XrpM!T!U27IC29csa$s%) z->r5WT@^5Bx7oaVc5-9|{U%CJ@?L*dxiScRc5-w^(_}tsP10cB` z+bW~-OzizqEmyFrqF7iUP=b`il~ztH^+h=u8tus0tSTmPZ$bvpg+4Xb7|no>!a+l% zM$*3Iy`HIlolG%#IQAqBkQ;-Wh(p4)!OdAY>0cTxr0Es7dB~kB%OS)eCaH%g7*bLfq+Gn{ujvRx;iCVLi=$1W+=|5^fUlQ|M(B%%1`Ix0tO;Gxq@VjE~Ut(rKoMPC-jw0SlwiM#fN^kIDWS4nt4)|lU`-s z=?ID#Gik?ywz(1HS6KLq$@XWXE`36@=J2>IN6%h4%=;tr4z?W?o;1w6Cak=qo93Oc zN?1o$0^k)2|MNfbe~S-kD*(g%n%v29OgWSc(K>Gyk2<#3e_VDUGbo2_QMv(@r5CD{_OhDrEDn32}GEK_1ybfR>M zTsO_xDV12m%=E_G+9nR9J$eZIk5HE59|!_Y`TQ8hLwz*2Ez>Q>a{zXr2;!?mUdqj? zu6I(e#SV`4-g#;2$n3$Lr1Ll@8Upxf)Uu7%E6R89e+uwAU89WvYTY7j(6d@ws(+!T zKvn4WibW0z$QLgI^7dH$Iy z9#j(5>|AHFP#G@rQ_ZVnt#LkpcMn3&;d4H9dJ11s@}R#@t>-KmLjXq{N1yHZX(>>! z)T2=v7Jz_Lf#|KRf|xEfLP%+0x~_!)u@b#69zrIq%nqPWY@W8utyGUrUY^~^#BC>H zX3RrIEjxu{Wf7d3P)aW$3$L=I3dnq^;$|t?OMppHjJjnHZkb<0k~@Q9bct1Lw1PM0 zwrPFQZ2tu{1$+daTPq~a1b;$&Vv@@|D$LEE5|WEEaX{rb27x|MHnp5HU(!=q zDUT87unSM%XmBMgfeA@*0p88WL{m)tYTUsw<9&%KuqnX9K4!2%9}n~H7sVt&4I3*U zg##Oz889-V&K$CZw`oyR7_Sa2n${RX-g`f*5MdI37`X^=OvVUa!;Q3XPTv9e(dPk?y4SV6GUgxozi%O_SgB;#b^ec!*c z$_9Ez2cTPyFv18=4aQe_;Fs982ra?SAT*2S|($MI2#}&DcOLoKykkUW#hrD0-i1+q&c2f z^YK+NQpEkThXmq%)m1I~t(cT}D@P<8-QmCNJ)Rec`SQ{Kz_+S@!+&8S(4B%*;B^FB zg9q0MM2_HcU(?y3sMtQaIKUH*F~W;r-mf!+7U99yvYZGW^etU`tI{R@4Eedw?9F|{6U7;J=oqw478?0rIpFbbNssak%_`4JTGh66&`*3-s5+T zAA8M#CSOVn7#_dkM~;#)?EDPB5BPnoW#sJ~zu)j9xrHN^@RAWzIqeU61x5zTD~7ip z>pQsEEqbs|IrumwJukJR;F*IsbcquYOu(F8l@s9j$qDaIL3n?5Fo?smK~jRC@#q{P znst3!bb>8)y#fObmLYi5mkNc@ftWlt3kEP7;ESVa*dK|A4#@_%sMG#|lko;PvUPKqPiV|0-Ho#~&jnt{G^6wFq=_11ON1 zzFAs4<@UW84Ekd+W@r|yoT)W>9OT65G&zbcpmDJn?&-P|6X}L-n0IxI&L^-e>?JlS zAX+0(9U6G*P;hqzKwk8o#yGELqsx3U8xHarH$Pffq5t z7Xk8xgFF<-T6P!%9tOZe2l(2dd>uo+4v?=MWNuOBG2r8;ARUnvH<2J%aslfq1~=pQ z3bzW^NDtP*P?&F|Jpm)gW%pE=2&ix(R7PKSqFSWNRUwU~{8pumfQ;U%*A}cP;F;&n9eA^bkc)Fxz7Y zE$~jriF<%0g@>%C1UA`ii$tm{6tnXu^Wk|puuU}C<;Nf3M?ZsyS)fjN?TXmjg`x#? z?0E#S2i4f!0n+ZY$gLo75t0Qs^6XXd@d>Q!Y%)LTUJcH#6LD&hbxROwZ^*kP zkVyKlpScDg#Y1i$<=9{8kIICIHreS*l1go|(icUIw#mn&AgxC({+y35o?PXlZZVnH z4`3r_!xV^YB+wovne%*F*)eL9ZO8K&jBj0rz5ev|llpU4N|r5^zHz1G*0XYY)$i`^ z?%Gz<`efHi2#bTOLI%^O#f`)k3)3?1v90 z8S~n_0*8%(XNITj_1D(0+n&lG9uA5e%$R#F$?J`O6{J{YO{(b);wv9-$Tc1sLB^aJ zvRS53<%dbcRRI||O6%@b+jSTO zS3D+}Lndg`5=sgxGVmvXYIN5o{qCa^7b{gG-HrlZdlf3;|AGT@LjDL63B7T&00M;g z|9TLimYCR{5Xd@wN!bcypJl8x=Y`)Vq-A1ry?{hGb?`ugqV@p!K^>@8HV!(NvW)*@ zJ%T`xi<`a#*tqljN$Q%6yqA9 zF0({Gm@pDk)k-+;Q|x~oU`i513&-9nOewZRgXaXIMKC8Qks427?Vowf z5=_^oqs9*xNY+zvOO3B+Vm(=3YTPkUwwBy61#Qv~f+zdSRue}Ko!xRzQlR4>o6blF zbsFPjEDJx>I~(NZ#o$c6nX1MSk)n|nRA&++I%~?fxy)oQM!;?T6iSzVDxW+xMtN~4 z9A31?@H`a!+Rwhi1j!TPq@I#V!=tb?H%{`2SIa3_5kU6?C-Fj0oUoqat8j{xb({+q z<8d9)RwAhJj4CaAWi{&!uvAQXPn=E5v6}4<4ir~$m!!$@0AWfxW;_NRAOqyPlR4%WfG($L(A4U3M#988-yhf>WL9EtK|AaOqfIOSKX4ElnkYcOF{DPL}AN61BF*2)l7-)8RNK zh#PdQteM00&0(i>uvlC2zOFh%e4%M)2EN$x1p-?s)!ssUuC9m#eYIGzgH^gtcov&l zD-Eg2}`A#{*a_Mu%C9=;}`j_Q?s3pUsggtt4dWQXkE|`b4x=a)3 zQdB@ALccrYVxcma^$M|?Rmet{uxTeV7js3VMk7lQw$P)E`fTJiB)bmD_aR9FDmiH# zS*{x$ozcjK52K>_$|7PxrH1t9<^~BWliF;Sp_Z1-=Sdllxv?DNqbIQ3{n%uqZz}ja zwnwmQeh|@574^M&4-+Mh-dNM=BwstS+y(lFk=Ubm zjzmnRqyTzs)ILU2y2zcK!wKZ3?%0qr-_N-Z9PcDYq}mcluv8_fEOt_G_TP%KfgoQ; zBc2kzs9_K(A{TY@rf8UmwVOJIt3{C2ogGtIiFlv`5U}@!UCv@EI1#9Ogo9{n+!$*c zya}*mOSppdokm59D3J}8IgPSqvUIm+kezjqJi?|5%^U^CryUJTn^(!z>=1TJ^g;01 z(2ppJE7Ivr=u?`UjUq5>-7M;`MWq#;O8UA8miV@qkk(y@fJ(whO@cxKA}NH1Qf%1f z#z$@DlA`sHBjbx^M7Yz}K+O7~OYJnqE;6;GOV^D|4J zv=`7MV|uK8SOAH!c=5iR8Vl`tfYXHVZ`H!fzmYD(z>us(g54CNkTN#b*GqYj!s!4j zU~t9KX-6?~L=`TzASpgI#-uMbO95)ZLQ+K*W&)ACAsUMe$_mFNwXNW6@H>{JeAKlv zr-ygrIa!)R-AW(;7%xqwaMZPqKsWJU{yK5A=H*MGXu&=whUBu)4Ng(=Q%Q6jU%~J7 z6)B%u8?!R5Y**_Bu*mMYDo+qGXQq0Dvp$Z>WIaD2rCM$ z9`4db2qDP$q(ce=dCtz@fQvyXdx$mgEuM(1ricWT2tH897}^%4!T|)F{uR#=^-!y? zf}H}fV;Csws=8?rTM1HNfPzBICN5-*nWFGKU^$#u>%}fq#0>h`iZaObngta+&e(&- zNwCDfBI~^Ua1j`02^&a?VoEssnYPN14aiVCVsx zQFn(a&q~Xy&}Wu1ro@%l!s5&=jC4evOSf$ObS~2kK_w}>!8W#6^kn{>uPss6#f98d zRdk`7^%qy_*0moSl!Q@)a#*i^sQ_?lRfXLEyir3B9f&pusT3Re0T4^ zPLLW{5}?vN$+r7Hh%&%5TYDVoX+(gvpFxMSK*4euNgxp`NFWh$HU-Cicnb@PWu49} zpw^}sbHyf`ilE7K1h^M$H-vWZS-I}ZddbBx=TQ!47EwNfr0)@qI9DzoNuMv0fc`(n z2MqwA@8C?0h=LRe&QRn`1jP~qq!v^VX_7Rt3?rl&f+>`7*NQ7ke6lTFTaq7(7;RH{ z9EnUvsBNjE(v`jhN=M*(euIzGIN#a|2g!C|MJp`zt(c<)g>VGm8+~Y3{B0=cgp!>M4};p1_bq$hA^hK z+bI)XDqo}K*jc;Zf(DZE@LBGXf;zJaCo*kPNHtMz&$eq<&QUWFD zZRDQjGM;vTUtp}qn6$3*uvDZq4^@+JjvkjG5`ol!zS2u+^935W4+Xj_o5W6hHv+3g zC@mA<#FB=-{Hut92Tv2`+p@a~+EJftcMdd{vKe&1wt(ny32)TbSdC|~i($Mhn)w2n zq+ySIks&b}_R|t07N74HtGv_ZA<*c2I()k>-HBv{HIzqe5bG8-fdF%Q|2kF)s9Mg$ zj#f^&#cBnWi2k;n!3pn3DzJugm~f7d9l#^qCUd)99`OIo_MiA-U%NH^wflhdE@W`+ zKJFKHs0n-mCkyw=;G-}JS&P^(-@ArXLP2YXO(3W%Vkl9a{uLa;Gbwk${1wIckiwNl zGq~b*BaQEZ+4x!)Q=zSs$xng(^~HFiYkS_Q7{Za+HU@vQGpo z;q=EB(VXEMbLS=dgvS&e<@hqD!+npyCYI)xRCnp?>a^jv zN&Z5S5Tk?hlB^F{GNNB+R}umVf6`@GUyIrJ{0^otUJB{%`WWB{HvpnSv-XT&OMC+- z%|g`DROzblsji_MfwMZ2ma3z~X*wK)vw*Gyj2g%fy_%Gi$jRB+I$9Il0 zO^8rzG2jvVX)Lw?0q5coI}4yZlXF&Ky@4aUI4o(Yk8}oSdnJ?fX+@sM^Cv4&<_|`? zF7O#~onO&=6guF9Si^~^qQke2C7)r3?SNnq-Xpl9ZAQF}C-AGhN~Lw-EDvj6rAKb4 zoy-R03i%S^rVHX_!Q~MNmqTOo*NWAxAO#t2>}1RmyQcDXRm6Qmm&KCH2}ce^d_FSU z#}TRny-ALetbROWz+9)rXm~fB=MnYZ>o`yfWuG~KDdjxc8LO&fUR1w{T}-G{xwKw6 z*CdhQ&@M95vK=Ht#K=5ml1wkZzF8?n^YL*~m*+pZ@#jKWLb{f(=@UU#Wy73JINxc^ z!kjPJwq0ghs9jWSP3+5N#;+2jsM+C^)e$roNIaENPO!FdJaldA@qH(8r;bL>JOu zLQOO*)L^gF+BCQ-1amLl0u4X&fVFiM9lXYXExddkwFJtxPTmTWmpJy(;Uf^breJ_} z-MU%s7C~>+&#-_>IAfZTBRg*h5|$~EHj=&orqNY4rySDvls}Pp#tTb$>#~9og4ExH z(40z770t1vEwLcz6yg_pMs~V4e%^E`p8#mjWSIA)y0ArWBePt3F2H*TSE`1i0oG1zezR}$e%d=hHuIflt5mA|=&*}4_k}f@W${3HxjYg7nlZ3hN1rRVcB6okH2=IMwWD2|InR(&XhLX8 zAm6qGg_UgdZ6y@=CgSl@9%%UOBA(BSvQ++R*@~J1*$iFAIof$k(OlnzyK-+XA<-uY znyaRyTR>NBS5Ss(Dz0D~hhed*0%Np@e7;!Kw#bT6s|m2Hs!_Sn>fc}Tqv(prJwM$P z=B;Kvc%;l-GC|T+z1mPA)aY@d#U`hAR=n(IB57)MIL!*mB-+W@i{CX^)3kqh2b8%9 zoL{o?8=({X;pyiHJ>0)rLixoKZ{S_#=!j7t>mkatEAR4gg56<|44N?o^=toV4zO{U zTl>_ViLaG;Xdq^ z{v*pxts4OJ%dIg`oZZL@9$(5}an9L8#z#u#T7rwLw6 zrw8ai{!T$PJ?T#R@%{se=mAJ;osC#!E}o2LHf z|88z}vu2}f>brUCqG^6#-+f!0jQ%wJah4;Ec8lM5KgS<_{3D_qxPxS95Om;m z8n}$C{Jp6knfhPQ)Y0+bpC6f6tTCib8EA+wYAgQapG`z{vJ-7*xi@;yqKIdYw;b1 z;e}Tg*4i8GR;Sb0>9pFL2x;Q_e}8)+7+9hPln_A#M&!lZf@g~EZziLmlSSMRZNc?K=ZI2Wbtv+;jKMH zldQ`tV(WmRqj(}Y&E~`AQf8~Y)mqAIcQ)HgnUx=gWlPZ5r%X|!@dn&fGi}Lt(}gHaFV&%Y*X9;3syOaMhWfFiX%SkJBI#~Y1d60Y`ka)wI@0l^ z#5Lp$DlKu#ak-7_k1U&fW@~E`K83R0XJR7SS<39RpsS0JcKp@kYeU~ES$5WlbdZhw zErPX5u6$l3Rz5G1DxVh#mCtjc=NZ)uEcJO2M}1zzP@fm^)8|F(w0YmoO`UpAgDb$v zS8HU6C` zllUBTH)L&~zKysa>JXCM-{1<;Nn7Iuo?PRPVO?a+jSgJGX9FI<;mw*OQ-9mo=#2jz zm-1fQjKhDV-=}|8YsragrGw=?x-U9$T#)fB0O~_&+;p~wR~f^-nlsybwIgwFWRdr( z_C~xeRN83oaO!#tx)G(@#E`{gc{Zv-XDCXk?P2Sk;k2W0-n79Ry5Z zknz4(!woN;CZBDCzfy)Lh%>7f;l}l>|&|@v1H)fEP|C6K#Xb;Fv&>0HaECn>nBje=p-4Ce z+;w5$Q4JB2*Z7YL7cI8Gmww<6LjI+b}Otn{OdI;7xM=7FKE zD5xch744|7v+26FE%GhoAWI3P#FJt^NdyX{Lj;u$vbOY?2!#b~LwLewg-Ia1E?gsV z!p6JT37IpZ8RBho{O{+8YF?ZAT}&36cc2m5(1_beB~ne0MWtwhEKq8=7-olZg+Ckl zkdgqAdq~M>KQs?%Jz+w(ncvzr+oBmw)flYBwrJ~jc$pZ$@Ham3sJB&5FeQkQ#2@c7 zz>EUO(WYvGQxafSB|%dHSK(_D^?KfgdGB_ zZG)P+k^|eX1j4|JoZ~4yK!J3KpwdAqfCx7c3JchV@Py3@lSqkhjl>BX?^+Z7S-q#u z_g4tUtRi*zg7+k=zI*qH&fUHH^bd+CuUT1aeSh8f3inAA;@*F{_n+>9@M=Db%z^x&A<8>*7w@MlP&Ih7wX=H`u;9d^A5JRzru$Sjkx!r z?tQ2`@uBWwUwgd|CAx6$L*4sOcj-gj!N&Htg`wm~;JpuZ??c^z4|NBd++X2CiALP} bQ1?F6o%m39vAMn8hZ0@5_o4oIe5n5e&0TrF literal 0 HcmV?d00001