From 0fc0d3739061e9047638b173878fc1f8790d8768 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 5 Aug 2021 14:36:40 +0900 Subject: [PATCH 01/16] common Shape: Fix check to invalid argument add cmds null check --- src/lib/tvgShape.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/tvgShape.cpp b/src/lib/tvgShape.cpp index 1ba9a46..a2a8fed 100644 --- a/src/lib/tvgShape.cpp +++ b/src/lib/tvgShape.cpp @@ -86,7 +86,7 @@ uint32_t Shape::pathCoords(const Point** pts) const noexcept Result Shape::appendPath(const PathCommand *cmds, uint32_t cmdCnt, const Point* pts, uint32_t ptsCnt) noexcept { - if (cmdCnt == 0 || ptsCnt == 0 || !pts || !ptsCnt) return Result::InvalidArguments; + if (cmdCnt == 0 || ptsCnt == 0 || !cmds || !pts) return Result::InvalidArguments; pImpl->path.grow(cmdCnt, ptsCnt); pImpl->path.append(cmds, cmdCnt, pts, ptsCnt); -- 2.7.4 From a6c7ae59f699e41b6ba4b1bf07e6e9a1d967fbfd Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 5 Aug 2021 14:57:18 +0900 Subject: [PATCH 02/16] common picture: return bounding box size with the current image size. if the picture has a bitmap-based image, it can return the bounding box size with the current image size. --- src/lib/tvgPictureImpl.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/tvgPictureImpl.h b/src/lib/tvgPictureImpl.h index eb0edd9..4d329d3 100644 --- a/src/lib/tvgPictureImpl.h +++ b/src/lib/tvgPictureImpl.h @@ -147,8 +147,10 @@ struct Picture::Impl bool bounds(float* x, float* y, float* w, float* h) const { - if (!paint) return false; - return paint->pImpl->bounds(x, y, w, h); + if (paint) return paint->pImpl->bounds(x, y, w, h); + if (w) *w = this->w; + if (h) *h = this->h; + return true; } RenderRegion bounds(RenderMethod& renderer) -- 2.7.4 From 0002ba56b2550aeaf55b715bc08385e58166be44 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 5 Aug 2021 11:15:10 +0900 Subject: [PATCH 03/16] api: add deprecated syntax for deprecated apis. --- inc/thorvg.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/inc/thorvg.h b/inc/thorvg.h index a8c3bf7..6c622c3 100644 --- a/inc/thorvg.h +++ b/inc/thorvg.h @@ -18,16 +18,22 @@ #include #ifdef TVG_BUILD - #define TVG_EXPORT __attribute__ ((visibility ("default"))) + #ifdef _MSC_VER + #define TVG_EXPORT __declspec(dllexport) + #define TVG_DEPRECATED __declspec(deprecated) + #else + #define TVG_EXPORT __attribute__ ((visibility ("default"))) + #define TVG_DEPRECATED __attribute__ ((__deprecated__)) + #endif #else #define TVG_EXPORT + #define TVG_DEPRECATED #endif #ifdef __cplusplus extern "C" { #endif - #define _TVG_DECLARE_PRIVATE(A) \ protected: \ struct Impl; \ @@ -1013,11 +1019,10 @@ public: * @retval Result::Unknown If an error occurs at a later stage. * * @warning: you have responsibility to release the @p data memory if the @p copy is true - * - * @deprecated This method will go away next release. - * @see load(data, size, mimeType, copy) + * @deprecated Use load(const char* data, uint32_t size, const std::string& mimeType, bool copy) instead. + * @see Result load(const char* data, uint32_t size, const std::string& mimeType, bool copy = false) noexcept */ - Result load(const char* data, uint32_t size, bool copy = false) noexcept; + TVG_DEPRECATED Result load(const char* data, uint32_t size, bool copy = false) noexcept; /** * @brief Loads a picture data from a memory block of a given size. @@ -1033,6 +1038,8 @@ public: * @retval Result::Unknown If an error occurs at a later stage. * * @warning: you have responsibility to release the @p data memory if the @p copy is true + * + * @BETA_API */ Result load(const char* data, uint32_t size, const std::string& mimeType, bool copy = false) noexcept; -- 2.7.4 From 6f77ef97f894fde145185c059fb101512580e6f3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 4 Aug 2021 20:53:51 +0900 Subject: [PATCH 04/16] tvg_loader: introduce tvg interpreter base class for future extension. tvg binary format might break the compatibility if any major features have been changed. It's allowed to do it when the major version is upgraded. In that case, still we need to support the backward compatibility, we can provide multiple binary interpreters and choose the proper one based on the current loading tvg binary format version. Thus, you can add further interpreters if it's necessary in the future. Our policy is to derive the TvgBinInterpreterBase class to make it running on the interface. for example, if the major version is upgraded 1.x, you can implement TvgBinInterpreter1. --- src/loaders/tvg/meson.build | 4 ++-- ...gTvgLoadParser.cpp => tvgTvgBinInterpreter.cpp} | 5 ++-- .../tvg/{tvgTvgLoadParser.h => tvgTvgCommon.h} | 27 ++++++++++++++++++---- src/loaders/tvg/tvgTvgLoader.cpp | 19 +++++++++++---- src/loaders/tvg/tvgTvgLoader.h | 3 +++ 5 files changed, 44 insertions(+), 14 deletions(-) rename src/loaders/tvg/{tvgTvgLoadParser.cpp => tvgTvgBinInterpreter.cpp} (99%) rename src/loaders/tvg/{tvgTvgLoadParser.h => tvgTvgCommon.h} (71%) diff --git a/src/loaders/tvg/meson.build b/src/loaders/tvg/meson.build index 57f4f2f..ad1f7a5 100644 --- a/src/loaders/tvg/meson.build +++ b/src/loaders/tvg/meson.build @@ -1,8 +1,8 @@ source_file = [ 'tvgTvgLoader.h', + 'tvgTvgCommon.h', 'tvgTvgLoader.cpp', - 'tvgTvgLoadParser.h', - 'tvgTvgLoadParser.cpp', + 'tvgTvgBinInterpreter.cpp', ] subloader_dep += [declare_dependency( diff --git a/src/loaders/tvg/tvgTvgLoadParser.cpp b/src/loaders/tvg/tvgTvgBinInterpreter.cpp similarity index 99% rename from src/loaders/tvg/tvgTvgLoadParser.cpp rename to src/loaders/tvg/tvgTvgBinInterpreter.cpp index 62250b5..9c16ecd 100644 --- a/src/loaders/tvg/tvgTvgLoadParser.cpp +++ b/src/loaders/tvg/tvgTvgBinInterpreter.cpp @@ -19,9 +19,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - #include -#include "tvgTvgLoadParser.h" +#include "tvgTvgCommon.h" /************************************************************************/ @@ -465,7 +464,7 @@ static Paint* _parsePaint(TvgBinBlock baseBlock) /* External Class Implementation */ /************************************************************************/ -unique_ptr tvgLoadData(const char *ptr, const char* end) +unique_ptr TvgBinInterpreter::run(const char *ptr, const char* end) { auto scene = Scene::gen(); if (!scene) return nullptr; diff --git a/src/loaders/tvg/tvgTvgLoadParser.h b/src/loaders/tvg/tvgTvgCommon.h similarity index 71% rename from src/loaders/tvg/tvgTvgLoadParser.h rename to src/loaders/tvg/tvgTvgCommon.h index 3e2daf7..e7c3eba 100644 --- a/src/loaders/tvg/tvgTvgLoadParser.h +++ b/src/loaders/tvg/tvgTvgCommon.h @@ -20,8 +20,8 @@ * SOFTWARE. */ -#ifndef _TVG_TVG_LOAD_PARSER_H_ -#define _TVG_TVG_LOAD_PARSER_H_ +#ifndef _TVG_TVG_COMMON_H_ +#define _TVG_TVG_COMMON_H_ #include "tvgCommon.h" #include "tvgBinaryDesc.h" @@ -30,6 +30,25 @@ #define READ_UI32(dst, src) memcpy(dst, (src), sizeof(uint32_t)) #define READ_FLOAT(dst, src) memcpy(dst, (src), sizeof(float)) -unique_ptr tvgLoadData(const char* ptr, const char* end); -#endif //_TVG_TVG_LOAD_PARSER_H_ +/* Interface for Tvg Binary Interpreter */ +class TvgBinInterpreterBase +{ +public: + virtual ~TvgBinInterpreterBase() {} + + /* ptr: points the tvg binary body (after header) + end: end of the tvg binary data */ + virtual unique_ptr run(const char* ptr, const char* end) = 0; +}; + + +/* Version 0 */ +class TvgBinInterpreter : public TvgBinInterpreterBase +{ +public: + unique_ptr run(const char* ptr, const char* end) override; +}; + + +#endif //_TVG_TVG_COMMON_H_ \ No newline at end of file diff --git a/src/loaders/tvg/tvgTvgLoader.cpp b/src/loaders/tvg/tvgTvgLoader.cpp index 00c31a8..8a1a460 100644 --- a/src/loaders/tvg/tvgTvgLoader.cpp +++ b/src/loaders/tvg/tvgTvgLoader.cpp @@ -19,24 +19,28 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - -#include #include +#include #include "tvgLoader.h" #include "tvgTvgLoader.h" -#include "tvgTvgLoadParser.h" /************************************************************************/ /* Internal Class Implementation */ /************************************************************************/ + void TvgLoader::clear() { if (copy) free((char*)data); ptr = data = nullptr; size = 0; copy = false; + + if (interpreter) { + delete(interpreter); + interpreter = nullptr; + } } @@ -64,6 +68,9 @@ bool TvgLoader::readHeader() READ_FLOAT(&h, ptr); ptr += SIZE(float); + //Decide the proper Tvg Binary Interpreter based on the current file version + if (this->version >= 0) interpreter = new TvgBinInterpreter; + return true; } @@ -175,7 +182,9 @@ bool TvgLoader::close() void TvgLoader::run(unsigned tid) { if (root) root.reset(); - root = tvgLoadData(ptr, data + size); + + root = interpreter->run(ptr, data + size); + if (!root) clear(); } @@ -185,4 +194,4 @@ unique_ptr TvgLoader::paint() this->done(); if (root) return move(root); return nullptr; -} +} \ No newline at end of file diff --git a/src/loaders/tvg/tvgTvgLoader.h b/src/loaders/tvg/tvgTvgLoader.h index d48e13b..ba756d0 100644 --- a/src/loaders/tvg/tvgTvgLoader.h +++ b/src/loaders/tvg/tvgTvgLoader.h @@ -24,6 +24,8 @@ #define _TVG_TVG_LOADER_H_ #include "tvgTaskScheduler.h" +#include "tvgTvgCommon.h" + class TvgLoader : public LoadModule, public Task { @@ -33,6 +35,7 @@ public: uint32_t size = 0; uint16_t version = 0; unique_ptr root = nullptr; + TvgBinInterpreterBase* interpreter = nullptr; bool copy = false; ~TvgLoader(); -- 2.7.4 From 3c3c1b567a06ea48fd5d79c1c1c645482b894db3 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 6 Aug 2021 10:07:21 +0900 Subject: [PATCH 05/16] infra : Include dlog.h only when log is enabled Change-Id: I91367053d6a9da83218e0b9bd5ad8638254d4617 --- src/lib/tvgCommon.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/tvgCommon.h b/src/lib/tvgCommon.h index 596746d..4bf1d13 100644 --- a/src/lib/tvgCommon.h +++ b/src/lib/tvgCommon.h @@ -22,7 +22,9 @@ #ifndef _TVG_COMMON_H_ #define _TVG_COMMON_H_ +#ifdef THORVG_LOG_ENABLED #include +#endif #include "config.h" #include "thorvg.h" -- 2.7.4 From d82889bddf353df81aecaa8de1def0db17cf85cf Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 6 Aug 2021 10:30:42 +0900 Subject: [PATCH 06/16] tvg_saver: verify view size earlier before the job is started. --- src/savers/tvg/tvgTvgSaver.cpp | 11 +++++++---- src/savers/tvg/tvgTvgSaver.h | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index 52de8d9..0ff4db0 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -69,10 +69,7 @@ bool TvgSaver::writeHeader() buffer.count += (TVG_HEADER_SIGNATURE_LENGTH + TVG_HEADER_VERSION_LENGTH); //3. View Size - float var[2]; - paint->bounds(nullptr, nullptr, &var[0], &var[1]); - if (var[0] <= FLT_EPSILON || var[1] <= FLT_EPSILON) return false; - writeData(var, SIZE(var)); + writeData(vsize, SIZE(vsize)); return true; } @@ -449,6 +446,12 @@ bool TvgSaver::save(Paint* paint, const string& path) this->path = strdup(path.c_str()); if (!this->path) return false; + paint->bounds(nullptr, nullptr, &vsize[0], &vsize[1]); + if (vsize[0] <= FLT_EPSILON || vsize[1] <= FLT_EPSILON) { + TVGLOG("TVG_SAVER", "Saving paint(%p) has zero view size.", paint); + return false; + } + this->paint = paint; TaskScheduler::request(this); diff --git a/src/savers/tvg/tvgTvgSaver.h b/src/savers/tvg/tvgTvgSaver.h index 495d926..6f800ee 100644 --- a/src/savers/tvg/tvgTvgSaver.h +++ b/src/savers/tvg/tvgTvgSaver.h @@ -35,6 +35,7 @@ private: Array buffer; Paint* paint = nullptr; char *path = nullptr; + float vsize[2] = {0.0f, 0.0f}; bool flushTo(const std::string& path); void reserveCount(); -- 2.7.4 From 4877bbaf4e0888ed60f160e3a708ec2cbd40d9ba Mon Sep 17 00:00:00 2001 From: Michal Maciola <71131832+mmaciola@users.noreply.github.com> Date: Sat, 7 Aug 2021 05:00:04 +0200 Subject: [PATCH 07/16] JPG loader: print error string on failure Added error string printing on jpg image loading failure. The error message help developer find the corrupted jpg file. Error message is not printed for open from char* data as there the loaders are tried on by one. --- src/loaders/jpg/tvgJpgLoader.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/loaders/jpg/tvgJpgLoader.cpp b/src/loaders/jpg/tvgJpgLoader.cpp index f08e063..f3327fb 100644 --- a/src/loaders/jpg/tvgJpgLoader.cpp +++ b/src/loaders/jpg/tvgJpgLoader.cpp @@ -77,7 +77,10 @@ bool JpgLoader::open(const string& path) if (fread(data, size, 1, jpegFile) < 1) goto failure; int width, height, subSample, colorSpace; - if (tjDecompressHeader3(jpegDecompressor, data, size, &width, &height, &subSample, &colorSpace) < 0) goto failure; + if (tjDecompressHeader3(jpegDecompressor, data, size, &width, &height, &subSample, &colorSpace) < 0) { + TVGERR("JPG LOADER", "%s", tjGetErrorStr()); + goto failure; + } w = static_cast(width); h = static_cast(height); @@ -127,6 +130,7 @@ bool JpgLoader::read() //decompress jpg image if (tjDecompress2(jpegDecompressor, data, size, image, static_cast(w), 0, static_cast(h), TJPF_BGRX, 0) < 0) { + TVGERR("JPG LOADER", "%s", tjGetErrorStr()); tjFree(image); image = nullptr; return false; -- 2.7.4 From 52b4eb3c63ed7e520c21b9230d476cc70376af2a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 5 Aug 2021 20:05:03 +0900 Subject: [PATCH 08/16] tvg_saver: optimize binary format. Skip to save transform data by accumulating them through the scene tree, and then applying the final transform to the path points. Assume that each transform have 36 bytes, it could be increased linear to paints node count if every paints has transform in the worst case. Fudamentally, this save their memory and only remains to Bitmap Pictures, also helps to reduce the loading/rendering workloads since it doesn't need to perform any transform jobs after converting. --- src/examples/images/test.tvg | Bin 302268 -> 302022 bytes src/savers/tvg/tvgTvgSaver.cpp | 98 ++++++++++++++++++++++++++++++----------- src/savers/tvg/tvgTvgSaver.h | 13 +++--- 3 files changed, 80 insertions(+), 31 deletions(-) diff --git a/src/examples/images/test.tvg b/src/examples/images/test.tvg index 5a61851b499660427290f7aa54b3e2ff95bc5ef2..4ea5404e26893bfd11372e95634f7d70b891b1e9 100644 GIT binary patch delta 51201 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 HWBvaCDBnNh delta 51478 zcmdSBcU({Z|Noy#LJLunjI_14(Kxqz*(4!^?9I#Go<_>f>}g~~LXxbIBqLfzR%E1% zvSo|--p@1Vyx#Bk=g;3?KbK3c=RD8j@i>pi<2=se+#mPxxO}pH`sw;cA)_Zv>C?f< z$;r*hNlmQ;Y75`u_nz1zMg}!%OkHAKBg(pl_@{o-x`syD0i9E7YHH1E@P9R`4k_Oy zYP3*fLrra$|1hJ+Dype{z+(FxL8O{mNB;YOUB@?}`g#VRi|I44z5IxZoL6;SWOe#o zs{Ga0cllSR-{oJg72i`$ZK1CUs)DP}jjDf;{$J?(TU}jE?e|^fyn`Cn3N^KVxGLhm zga#X)_wZ(L5Zv0nW z0ag9OOn>>_ym2IhO9azLJQt6}`c?m1=v(ze>5!z+LD8Jc5dVo~ivQgHQY!yH?Y)=T^AB?;Q*gE1d8D6mv4B3t`cpFq7GY zne;G9NGUCq^H-PJ|B@M&?D_(UsM`|1etg05xE8pY^cBHgEiixZH}oGKEqn~F#HHpD z!g*UQ68^IPvl&9?c|Ya+)usLpF+#?<50JQVmI>l|SHR|BW1RY3fpfl%v3lP}WOh~v z33cD2{AVxWwYM6TG2bw+&+H=@%z7{9uP)Vaq9)cIdIE|6oYjK&vl5Jrt%+a#O0jpY zCU#se#mA~JA?a5hK3ISBZ%p^`^)H{_@DTD^T07bA^giVNDT0}BG|0Dfr6ozgwWGB5Egx2h`1ha;kGH=X$FAU7BMT^|kklsq0tm@Um(+S#SFsl*vWY;FG5-W5W zRYxHm(52>q2-smjgXZ`lpBl;Bo#l(4i<(mVvEIn`Fq0Ynyc-+>8k7CUcG!NnIR)9f z^LVqCnH4@1^`|zYMRx)*alMu5_pv&zGLL8Xh3{L1E!o%af{D8w=*qYNJc@9U>2-e@ zu*8z$g9bo*qwBx?XAFF+oVjI_k?8FzvySI{=p1#Sbyw%&{zzAusSWz#bCoA;I2DAT zrhYPetR4(f9BWH2U-U!rOh4MYtv^P_1jxL6a0u4vwxjH?;TW0FRi<*{BFs5Xq%(9P zZj^RY(V<&!nVn-J@JGKpU4A_uk*U38KFEoJ(d{1e+CKuPm-kUoAs*sAyY38- z=^dX5`>dW+v*0XlZSE^`Sd)`@$^}6~JhLWk)$bxvLD_w3&@DS3D#`tg74O^0Ofk_Qm&dKCd*_Cv zao$zt`Od}^7uuEz+nUe}e*Gj4Ds4tCBb})5Rx2{y)J|rx(vmuC^q|S@E$MAvcbU)H z+tA8lg*#1uYOT5;(e9)Jwd&+aIX;e*`p!e9ov#ZSzxSs8<6X!x)Jx{~xgNB2qc{E9 z;!Xwpo=Y4z&zp8X@u95;ylEW2-X~7Ap;4XM(2=ce>Bv(46RF^X1wGo)6I(B8{-rJT z+T*FZaH5GPS?3U);I3Ry7D%QyL346CP#1oUBrcfLnO^?(qYG)BsG^Op%uuba)MJw` zDP6l#WTd~$o!`3AvyPtReZLDm+3lvHLOl2dQAiX|67F3in`#7q^hh63c8Ixw#+a5BiediK8;D7WJnHgVR`J)Q^hv4&mm| zzSMWk4s@nI^yTeli3;fe>ca+b^|s^mnjYjgb{c9;?nT40=E&@k+nJgdxnYjKKP@|G zhdHO))2s$9WFAWDPS?Ml5j?ayQMgXIzr>3*11Vm)!~bixKOGA+5F}pw;zK6(3K!uV zzZ2b_Sjz0mFQs*VMhwKa%?|sq@=Zgb zj%OS)nn76ka2IxGbrg;p@5HnQAu`=}tVLAJI$`vXRrob#qs&6{#fZ^3DBM^)58r!T z6AoF;z>BpvWzGqi%2L8>VcyOuP?Wa$pgIs)YB3hp6~BbB>7!9TKpPTMT>9brr}`LQ z)(;y`naK1u?2FcA=2(!}o7YsWWqN(?h{61*jtuOK+WFoxC$Rj~I3gI&41BSB=^&8` z)q&9^SG>3}5EE`XV7=~8na4)kqjl6+C^p%`w%s_HclKByuKxsFd}4!zJXR#G)wP0c z*lgSiwZuTjc{00RutLPzg-EGt2HnL=Wj;+&7^2i92DiM7p?h?z%!0SZD0;U8R=*lx zYUnPRnsK_^bvto>x+yec5@pUUZVKPM2UYnuT|6Z7)bUS(Wkm|Y+rAd|jyoswl-n6$ z?7V!O>cIym8WceMVTI`}e6vXx?moSP%W)aPh_Cl$I_*dox(1hEULAed)+*)k;0x{a zQb@0_MCHIt4F`p0Ooi~S>rpz#o(hj8D4;jT zipuTwzv<*ffD7)hEY0CtViqwc#mVEo3qRHyGoSfAIX zvbvkl$owaa4Hu%yMw7~##G=Z(E~zz7gOGI_wkI<%{6iML-8zmamclN5NW}gw`IuNg z>n{~q_`Uog7Np(9e!C3BaSJ2{U)_mgo6}*ieFY}E+`=OkRJ)YjLgLp5)QY{0N2eEJ zz@$Q`)m(@#*#(H&wEz=a=HvUo$@n(xEYx^uAf_vB+z3YW6#ZxY6b=<$m#OM`4eokn z-3$C6rdsRJ=#owF>s^}yVq&m3;1?|87NKE=CIuvH$FF)iwB>Xdgd7zlC=`~>9^tVaT%6P zzN5fTvq+4vybFiYMcDk~9(vj@La$!8Fm2XCuOJ#-FwZ&zVLhr38?yn^p_SAnR& zC}0V-as`U9y~%(dkVJd+UgX&REOw0Yp#6axQNZigJJ|>DE6$oO`6a+8 zt|c8mwHrfI%xR*_LG0&p$Cn+1@1y3V9h-#J(faf_T(5gepTBfoBj z-uya*gIf@8@dt%dBk=TjO~RR75Ub!@q}Mt(up-}zOqb?E zBcnCxRAuAEw%*ib$~Bo;ZF|uy%0OV82OaLV3FRJ+w4v8QsC(GZ;=Fy(aW|(ah{tGZ zMXk>!A(_i9pL_^flUq=fWipnU8_;t9&8nUqsli>ZY2O|0_N#ollg9ZJPu#DfOqYpF*fWz&Wu?F%X&o$EQ?u=(ySt!>9-UfTOQ$Yd<1TM zEJTeDOE9+UOq#ee^*gupkp- zM&1z?Klvo{@$ApS_GY!o<=zp9YuIWkqyw=)bLyfjKybJ&RiOK50NU`CC*ytEItRue_Me4?>uwN5kvJLVs^vYMvR3x{hjOqq7XRbZe3S zjXjtUrB9aiF5}&*B1DY441-g7=(#K%)1IcoZ0}JP32$QG<$RgBJxg(N;$uwvbP+{c zuFI_2xEH$JF5%(uwa9)^gahkVBVyYF1!iQdfM3u<99R^IjpoJ3=TYD=|32OuEk*X- zTTpMb0C9J+(B}uK(tXcpgf+rD#5bvdlRl4RHlzxnbJ-IdJ9b3S-+U2SsfEIa^Z((dTvj7_3|<5cW=@hSs*hf znb#b_ndoomNlOPPacYngIgd`pt%0`W|0EH=!&*_#(0%AU-hy5i97Z&kyDu^YR$E%q z@U}-Vy-Pic>az{1p4Z^6S5D652VtY5PrEm5N0yfkDLU^!i_L13cz!vy#?>N4|GoIQ z+ki3?vvKzL13dk51y73eky1Yc8g(-;-|;wFwY>$ap4Vi~nf(-=KZ?<+Nf!FIDv)_7 zJptnjv#@H_I#^A9h<>NnK-2P(0+ugU^5A-eeg~ppnEZsrsz@Z)dVoydNLUTI0|YI^ z)1_DNy<-PeIz@3Kgirqfx9l3oe^V?o-L*n^NTo!AFgVaG$!l_mUFol^^W3QYjb*v|bXD5metI@CgOK+$tS`1uHdCDB-t@>qcedaL0(q8Nb%%do+#6k|-6!G8TitQr-Cgx7bW5wnO*136f` zxsxj0LNz1w-2V}$r>O(mN@aF4uMk@Aeu_gKGlcEYxv1*>P&oAMr_3p1ehRL3x^%Y3 z39QwvKs6Q8K?Qc&T2Q&iT^O6%Qscunaa7llYFk}Lqam#B=zm-0>lPu@Ec^n-M|slb zFAxC@IogylX+JU)^(lNr9v*2vhI-vR zs5xE7HLLTW0h!oFCqXOkAb?+7iDz=2qqp8u(6}p@<$YV`DxCuu`z9N!9&SKDWHG#I zuS3hWPZX%>u?COdKY`be<#4(96a#2E4w^p3g6L%km~ju;4;G{RMJ`gyyQtFTw=lx6 z2cMzWQUjYiJ(u~jL4`2)&ogw>IWJsHxr(<5kA=zuzhw?hs}j5-^yu)+R3s@sqM8cn z;3Jl0SWw{kLbOP+rI}pwGjWbI>c|bOUEha7Z{Lv_Ga!VtM_uHO^`u4rY{gm=7rI*O z7#=omP3elmsMXk#lD-{;U~NSsCm&ap+tTs`i-WC5{lN*?)oMT%Uw1;)^BUas%DLD1 zL43GkK;iDYk@Q)Y+P~V(%X@X&ePRt34XjP=D-U34g9c>s=PFjVF2=%5`AF`21Ko~Z zz{kbsVRHQxOW${Sope)Xhl&@tz4;j`)@S3}#XB;$xh3M|j9kpo+=NR8C9rf}kGQN7 z1ux;FF>p>Po;6>IBi){(*7y~$-B*k*Czs=rS`jQ;L}0u!A9`NhRq0j>Mwp@Z4I$Sw zaOhi^Ol|cFVMW*rY-)T_SkbxwZNEGb+>_NvVyLDX{&}QNXLp{2eap|Nrb0USjETXP zbfwFEe1jc*=bEo`ccSvPH*xu5ADY>{Q0Ci>A>=Xf5*Ac?(gd~zk4$!<9_x>@aNe4H z>KtJktR*=tJ_MU|Ua9^(p(-~%B^AfYTk()S3G;0YXvxAjsCr(5yIyHizz?EuKt0Mh zw+Hdd^k~kscr34{LG~A-vAm)-ZHqVv$8HViXtx5)33-C%&9Ctr!n0?)ODIXafGz#f zp#Go`n0s4hXybD9GJk=Rv>f#2>Ps9Ob`Ya#7}bp8*>3~>^mwX(X5?Bt)O-fd zPOG4Q?*;mAT!{nDC755l0$BL~bw(}4wGP)XWm%9aU9VwA80G&1Pv&T%bnh#f$sa!m zP14FR_uNI{q|YrR1U?l8)KVvjy7o0N!=oOpzH$nQNncP+g>>)*Q7cugK1ePbM>N-1+kbYxKf^JDh~MDQ`*L(xa4O=%XJPz zKggO8c@iVI+~#dhA!(ikseL$wI*x`^QfCiTJ+HxCuPnUD529nq2bD@={h^D3`oTMx zyYaa&mDQ>ezxPr{a&&!a^8PeikiX%7>BAa|`0$6gGOjhaM_KG$9- zlKF&H9#`gG#*hhK{a53NI+=;s*v&uUCybL-MGt5AzoNc*)`@v`?3w38z7?%Q?L zDGXMn+qA?8M$>-crDaWg?e$iss^`^>UMk;(YMLt=Kl8`doEju?J=;cu%e80%>k4c0 zqFbU69)=$Mb*bLwb~vo4D|7c=XB^vJhmNr7udkMtOrw65XwF971*};c7h8jNk7$Ul z9ezW)&tEFPuh(p)Xuskif>z&$L{r;0C}~rHirugI)Aj{#=e%#ijjWt4B`RV z)u@5$Ja2LXRV~}(Hz3iR9?N(6%4YL1Tq}{G%mQHr8uRtP`Kt^4$YSS`wZ06%t2l=HQmkqyv*Y9qXw29D=C3ZaX`OhK6xAb% zAK99m_)=eWZbJq%W?dYj*nvP(D-w0AjHqeaLR=ZvMCMf1)Qi{u=C3Zal1{6|nHH@< zDjORmX0WaQ`3+AJ>C5I*iKBT*Z1~$#!HetdfSs4j6T@~u`MZtk{KxP1GFPx+#5$gT zA0ChAY^Rl2qi!O8%xFWc`W(Pfwod*hAGIbL9k(B&*&;2`b;BXpU+|{Uyh#7OQ6U{L z&!-|>*PCYiPQ!IJ7)u;E<0L2aCYNJpP{}uv_@ZqVQtjGO8~tq9wDyrXUGD-~Jn^Dt zYFCiQc3Fwf)UH;a8(dTMTr-gh?!x(V?jU|vAWiov#AN#pGH)%r!5Y-|)b(S*e{s6Q z4fdt;A_eQmU$7xqqL{Aqs2AONdKZ4&5CzXqhevr+(#c{Z7PKe3mSs>}XeU!E_B|Se zwDqOmgDbFuU0wc;1*PJFhMi(=t7S+WqC*n>+&3ZSOl=BZ$}$4~E;0T|2JWxXq2;VL znwz9e-T4cpldDPQD@#>#`EuuS^jV-z!w-HyB2UBq;T7<_|1WO@|KhJy9nw4W3$A&( zG`?09K3mjN(0-n;HTzgn{=706jg}r2ca^N`^M1Q1Wl zJ2kD0g*&(6`VYGgp^pPwT9 zke)G_kGrj^fK-vcR7O0~Fjp+f+JcuaOvv{{EE4@25;fTYV;ut$6K&#JOSEJ8<35+_ z!{64P{6Rm_@d;*3)L`GFx487(fNFkygSGArW!~s}0=L;t7cz`AE)d@WuOJkhA9_5(Fjyncx=OlOnZ_zMpTKi8&2hp7>qvhFE{ernqp!{HVbhFMX_lE ze=ys!9eZ8}Yng@%7UNh)XS%;&8EflZRQ%1}cA-CFpw-Dux}P$jM8iVinNz~Lp?YLE zsFdvudep_}8J>I9QO#A`xMe;?4>9ehI`w&cmDSfZ*|u~EhTO6wZrO8g*`5Drnf2dC zC(>Tnj8D(&v$AswM)x$5S^19r%-ri!;hr?KN;Y(s4#-hA9owh@jpZAN+{-3Skvj%I zfk9?{k}9e^Z>QNx=~JrF)Z^pPGl*)WOA?>FKZoCL`lNdy9il)bF|uw7@)nuU0(LZb za#*>pR3o6r$KZ7kJ4NCW78GW3=MUjIz4Ec6Oou63@FLSmB_Hjc?o8sULY&O(hpxx| zcdk-?<>coY)I;;~Cah%d9f^v>^{kR|;19uO7`}6oc|1FomAx+1dHgmkb#OA;Gm!QA2D~nMT>Tb4ORj5SupSw{1lQVf9V0$wc`sPTis!;J< zEc9>w>Ox1}-3eE7SCUwg7RwX41HG=;jdV?CnM-aYppy>!C(Yjr`_3*@T)bOVsCeG^ zmz=-4(EDrlqN#~1Ner2~o5chN+LgGU^@~n2XX+(kYKrLAc@ReaF0?W%5qSkJs&n&C za(-2z!LdAbRkDw##5JD#u=}k&)n#uH@xe&^vEdj>cRN!o&ulx`Ln?gw5mmQ|=i=8z z%3rlw`Jqh1NtyFP!ys6EieWtcNt|7K2R^R1rSRT+u#%@eiK3)r6VaODQx4!|pVoBl zTq4qVUKJ%LF`dN!EWAhH$P}aYG5512^?rIoeDA9#jYXTzA&sXniIe%Y5vAhTji-^oQ{EN! z2oR;^jr?AU-BbDaDE!!w>_7Q}9neBMrQu|gf2qS$;w&D|;_K(YuC;ZdE^!oqGfi%K zQPtwV_fx(t)9`P$ydqE4Z4ynIU59g~Ev;)`Ahx7B(ahumG+p0{B;IO&8&gNOr1Nv` zp`l(&<)LzomZMfCt;B{KZX{9s`r5bgU{|%B2w&dc>WLjFNCp0R-(AL7th5- zy(p85ud&DimnEuE^S9jUzMHDO8IO|cl0@D0`&8$eEGM_Er9%=svK*YevoURAO@e}b z;v~-Dp(rjcmi}aWd`1(QdS^GQ2TBstNZ$?pIxj9q+AhWo{jk zI4Z#tp2S|TkF+?ME&39IAYPN2Ztadc z+QzhTmYZtL7XQIXwN^XMzC%-aO)A~zFO`|EGy+B)U)CM=b96}J$jhP7veBhJYx-ll zxgPgK7)s`;VZ)gYNi_et4CNYn zl(lOaG#cnrVBj)1v^1a)tj2&#_5KgDQleqYtN5v2Yw<3fKaiPgSt(nO5{E=%(O$XS z>KRpGI{;}VdL%Jz`6&Dv=t zzV&p_Unz>*m?EdIT`Kt>}7_bo6Yw453-yu<~6*r{RJyH02LtkcBqvh~(*Qcaa zQE0>Z#k4Vtu_RlM49!?SQ=lW|SN43bVLl=Fo*(wd81R?d6=|&0NI2tw^y9iTO3MyM ztLpq89%|=-oQZX5bN8;Oe^5u}uA*-E*+P%LPYuHJ6a$jVt=i7AzDnSK{`{!&$PYL5HU9kAX9frTKq0VECT8bbX(aRUvh$?!L|c#d;n0 zsm>2p>_>fb9g^rW`T(Xh*QJ~4iP*kVj|!MOm?b80n47N4ovXTU4N~fxYg#CVI_0ni zW)DISl;HU01Uz^8j@K=sa4O>mI<=mUPF;T@-Ece{2Yy7$CVgd&kNSif2YX_<|9jlK z=7p)7U%_pGHQK#@j+^$zSoFLQrOz8Th-5gZ7Vj6p@qp}+bt?8?@t{O}gJC&(N;c>pA*2Ho>36h4`J*ggvFQRp(im zX-HXb%m$c5_5|?9-v%gqeB>$fO4~%daSp&Z(*uZi>d4MG$?!T5fza89@hWmT?rcs$ z?C>?J-;e6@{^ylw@Ubh@9eGrH4rBCq7doP?fe}!{-B*q(k$LhZG zu`lKa+7^#TX5|MQ-ybTmBX{9PU|cU)|9Z=Y#C-sxq5hsULU}={SZ0+|JirjV>Q^CBmG{twe z?2cL24Ci)ctIq94oxz=1rWjPoeqAGhzYS2@eCF0XVl!95+z#;nCz0Qf&M=>Q7|oVO zAR{^jsjOh`AAbZBOINf1;$g1o9+}|{vr)NY8@`-6%8`%T(SB?Wg0}BMLX#)#HNJ-( zuRg;)ITB0$`HF(Y^D(;Q8)hGvfDN19BhaJ2#Exvp_<%^e-q@G=2A`Yya0q2NoT?m< zSnnCeJ#5BC@asi1C))vaBDWq%29drCbLFt zDSNDjxPFG!x=8lA{DO^}=VPSSHx%hjgl*Y7Os?uLa|ElRuGH;=Zw=nSeu^*3@0MZm zb|*C1`V=R!TVPe;T^RK<$K8wBs&faHQ-2O>j`jTNufH0AzBWm?ysKj;9%%>hV`>+E zUsCXKN(5>&IfABjmZP2RQH+UOt@?dT!ETxN*IdR{?`;TW-PX_>JUIR~K>0*pv&HDJ zNgp}PbP*(aKfBL*yk*#*a2=ZLf++F(vGbTXWf8>XXvZTPWsYHu=PI3TaI89xC0x2E z-(~K`9ddb6xysdFx%1lRe!+3=g^*b6_z<73u0YuU_As6LFGWS*-C?XNXIJ>~9oVV! zFU3XlzLDD?y2AVO-6XaxK8gq4I}pc;#oQxXVSM~N8g<$!^AW2lQZDT4i5aXPP1(Ig zW+bay=AVn^(6Ay5|G8SlE}pCKasFFe2#CTVeu~3iM?$OT2h~%KZS@sp>_Z?mKzY`O zJ5dztgU<4F`y@+6?Rgm}>=g@oonpVz=m;|iwnT~_ejM2<^m-!A4n!&``6yc(Z%?;z8bg(+qUb8OfRu3KqS_azynSc_Yn@#&FnSzbYPmqP!a4FAy@&IM*R;g#2|ZyS z>@4$zfiJK2dm@gbNbN?2DO3kd-Vc^JP~R1U+YIK&1t)aBFjVHTrVfbzFb?hh*kSkH z@iNzQ^g{R2f3TRN9loMS`vPjVnF-z9TJ)%5U$<|0ZH~`m`Df0>5^oE`;1cc_=lWqtf`=vN5J zxB26P)nJ9{U{UX(GF_IrBjxB2p2J-rJQ*(YkD)Vv7AHX8-VviN|I3G`ZP|HrG7gv7 z<4o-tGR@L#@$mj^ybH7AnBj$p|HqT{=1XL{?`Q+h(=FHVQ0u}=#q|iB(F?K1H{$60 zP}qb;%RQp3{fqml@ZwmEyzGjug`-*WbHUN=1NakTjoF=gBA}70Or4>=sHh)|f(w4= zVl+_2W6Q#2u0Q0;_W8l+{Kg5VI}MXL;(-GuwI9zP9iKDxp}=VZe*XM5cInggKMk$q3Fk2 zc>E4S#`Tpl%jfb7(tIkL-v?mr>Txpt+$SQkPmBI|95DfR%|rO>K7k)Z2-0tlXDvZqXB_MQ$=vkNE<1d$FIGKgM4f zsA9L4Lu4-P;)ci>;k@a9Ge#E-li6sCBb(F5N%M^edD;te4P)4D-;brHwa8x; zhSj4uj^Zzs4t^;0mR*OxV}A-eodFzn=d$* z&*l&&Ti%RfA?6l)VCB3eGB=vH!F``-*zjojJbwf7l6v9n@J+Z{7z&FQ(XcWN!;?QN zWY#I|1NHE!h~|d1bQ&+S)#UML^`PYdoXQyov&!E1#eDFiHws#g!}kqdkb36d*~w~A z_3R{4oSoYJf0&(o>x@E?!~frBr$qtPvy<2(O6MAy&4b=J_hIoof>%k^+^pvW`;Rkm zeWnABFPkCr>oOlCE@A`9M_(1khWV=~<&&t46HCof^FnuZ1tf|yRhV0FM=p#N!)R`4;tA-U^16x z$)#T92`aNP3c;uPV@OamKGyFE+YW0v7N!%LHC%@WjRVj`f0>+Lxkz2JgW_rL!>}2@ zpI6_>m{gj8Pr50*kle?CDo5D=HGvl{$8et=t;+2(U>v_2qE&iB=q?^n=kQi%2a-5= zA?$se%+y=?s&r3Ja1hA*ct|YxcpE>s9MO~)+Al$(0_hy>Fud(Pm_08>*i&nf@rDBgq zD^)bS#$F{=?00oFN@n-On$&}z;_TB}G|gwe%y$vB=mLMBJ97nkDfC8HA282qa*g;x zvoAI12oFAqbAPGPjOFw2jzeS*u!JOWfLkS+1}s9M>o?ru^@GIV^3T}M>7saXHTvOF znQeJhV|;iiZms@|ee0IPCh02_g&E8F+xZ<eo>32ABECD+c-{Pijyv!cF0I@dR$x>}OYP98G zoxkkH4jAI#x>5hBD!s&9-sPdF({A`X730FvT{7!jd4g@c9&4Y-kwoH!_KDRTzU__b z2E$iAhw;X3keJH5F!ZR}f(y@|ql6<}C02cYf#ePwIFR8DyHu=^87+K4PT*>6$@vIJ z9wQPLv)TVCub{+=FXbK_t@wN3@Am@f(>CB6yOAj_HangZA?149hqYb zRM%5Vud05p&$ehQ?n;S<3s?zqY%8`Ia^TvQ{doEHAe`^*MIH8*7CHZ13XTpu1nIR` zW@>3#D}?>_WEa(1kT_yMOR}pqLJ%WZU%fak^SXX>`h8rTqn&JMDlg9^TKL$oo18sb zG`FRMGcGbi#_{j&ZIOJ^nSSNiqa#O~|Nd+ybJZ$8GB{_79&x)V8>;ATc=H zpWEarbZ_bNUkoesq|97FX!qWoX4^!|eB$Xw*FE0|GZQ>%q?Q^at~uvTpQ>~ao8OM| zSJh~Yy!*b?l@s<^6G)SSm&g@ScCXFutRE%?&}yZvAW?llAl>Zt(7(J3(P|@oL1Iuh ze=@7-A>^3({1+1|Jo$DctgY`szs5w%>^;nl_n~+toH_4FfgZnQp19#nes}6(;PrNF zW>ISl!)v~(g!2an(!~=?Ib7`=B#leyACgfs}DU%2>&JXO^G*MO{xQ(o9$>= z(4WRa_Y1zNgjr63>|_%mS48<^Jy&mflK>uYj)KI_nt}B5z-xb_+CgPe)Z=z+|r@7JnYh}XwZ=TeCMWxL8pLmayh}yg`X-C@Q zs~QV4Q+-tl-_!`Cck?3TiYOIzxq3zwM0)lvg2WT|0?4%gC;uH~pe32cg2euY{`6pW zd!f96&wo+y^P;U=x(Ea2d2l&vWv+kj#?k99ga!?~DD~KPnFBQ2(C`7;SWwuG_DB9~ zETkm*suI?}6+pt12)QE4HaePaiY9DD4n2?qiQ`PqLNoOg#<7;HV~v0L`H&J`vyVf6 zJAb-4Dqmub`D@w&t&MeG)A zmdrubAs9P8OXeOnfQk)lJ!LvF`zwzAJvfR?wq!ot#Oh@>ET3ZEc!`^)?#1hp!|WoK zh@omn*^3|jX3!b4cbsk2sjI?|o*`M$BW8PU1%MLD1#x2+Da0 zXvUJ7iV8kx#~#R(o#c{HV4)(m=2cM7Oo>Eie-SbS&UBo*3s~8n`MIHkx zVZX=ygjRH){Y)i>U2n>!W?L%gY)r@5>rCR+OXhUR%btRREGW~~okP1UsN^pnvA^oy z{K~g_n&yK)kMO3Em)n!X>Bl(iRbfFdmRWEhHyhgja#gw)RZX*_6%}o0o|Px*+P0-C zF05{$H!YasMKAAq^A2iWG;@bH4WHUhDzDnaL$8#OxWDn$b&N2 z+$m8#FNhwruq92iU<#dVFH^f+PYRx8Bjr~X>ua_g6@%aG5Z;!bMKy!Y)?#CKD++FI zKvz~e$P7Ezh%SC{p~}ccl*K+D62*`VpRvw#=Y|fQXO|g~CCpnBG^x0UlT>bX3zm5G zqO?vLBysuxUm7&_EgQ?)k*(1iT)5-Gdvm?wWk^rjb5EUinS@Zwxg0UdB<9>-A?(qv zCFNJ%GteBM7=FxvGT2E+V$$)(bb-B1ejhhw#~lZ9PcY*cU?)-^XGwRAn^9g3Yg#$H zg-rc{4rKh$gm$Sj*?V0Se~j6vZgjwvodg^IAMWq&O1&N!k~nj1dSIlG4#;VOJBi+$ zgIjvjrG&zN|IB`p}@E_5Tk|=DE_g;gz_i*`C&M zgoVW17wtJf?IT(bZco>Y-eV_Eg@fG{ud#=Bp!zYf5UqI>ttz~Uy{A0M&+i(C!zi2XA#JC+n4Xa)pQc@MzWVYu2xq8P64r^oT_H$~N@bc!jD0 zLs<|OE27DEn*Zet4L1tf6Rzr!OQ{N(H^;IY_D%CqsQJQ^UjFJY^WYXo()sRzv%Hzg zeG=ftUlSeU0GU}%Ze+^(>8$-u^fK0o*V^`!%A)B97Exc$YYDfN{E^hO#3*ig&MF&t z`TMBK`(K_bgMw0RLb2~)08M%PFU4o$z?P^z^L@#I7331{@@LYg%M`dB6lgK)T_rlz z^rPC{7GR&bK>n{IWnQZCrb7cK;62O8!+9yub2aE`<~ErvvlU*X#ml>N7OM3+Zjsr) zX8@(}>=@u0NP7Go@o(6HR^LpOflGpa6URa(Iw0S@3o|H(fxx4?d7tbAdq5@?NT1 z>^STlrn0af%cHqQIA}NrE4`ZNPt)10bvO6ebaupiXGo;KwjsUxN@T>ZrPy=Lj2qLr zNgZf52cHCSPyEVnOp1>z2n^zYqsFoRHVdG z8n0?Y4bMBNxR2dF#dDDgo(H_9S&%q5YqJmD!2=%jiXHvV*LSCP*BxjShrcy0cBH0T zU5MDDb5wUHD&UG1UFP4W+sV8+$CmE=w4ixm)@0#rPkY*%({T1etfq|{O*1ej`zi-2 z=)x_@UzWpE=+A4TJc8f14RL68{7%YM746}-6m!j_bk!r-(D z*0ih^)NW|eptOF%xj)7v?tCTD!>kF*{PzTLdcAe^uFRQcW-QGX3-+a^EQh|9nZfz( zKWZVgqABr)R|@F>OAIVI$j6fHC+56ujFHSX+{`RLGfd}YV|j`ctGY*}P6Ph$@K~=mbSmCV}6rr|35W9C7?-h0{%Z8T6 zxC()nThr!?PBQnWTGN|^HbTNMD_X(VMk*$UE!6sy(&^qORHOYu0k@m@)Bp8qb z?}FB6O+&Kg-OnTz4zQruOWXYC4!5TyQ#(Q8eGgk2y{_0l*{CJ;A3j@V{VvA5qPde9 z$~!+rWY+PM`1H9N>DyQOHF{YI#g6xm{^Ehif3|ZZ+INl=Bwmj)rDs8*!mYhcRJ?N0L`Ct1O6p+1 z3rY4RH)$XY*;J2W-Zd1?yXesFZ9DuGCcN*9XKg{EBdg4e9KZT6noxtNDQkqe~U;1YH&YI=EY5hG^{S@y`4<8wJoTOhoIxx7UVjpgUr~jttezonBcj{oR++vsG{Ok{fWZJWOIJ2=g2*v zykVm0uds`1LQM|O7Y3C!p^xVfPcWTI!$zoxUZ9{5W zv{(qO*O1?&2;n)0LJq22A{(Z@meS~;zk&2#z@$foyYDYKWRBCOW z)jA8_&$Q`keg`4Ep*BUubQH$>vUK{2gtuUJH3PaFwbQW+@Bs?ee? zo`J#!o=vwj76jk3T6AZYAawatlfGI93U+;KatOY!&~lq51*ZB78jUn*Og(QQGgyPJ zDDv6}*7543f5=nt?OlT(g|jfK?$jcyBaH=^YqM-_EKCW~rgy(gh3$hm z@V=vJnRB#BK`Tv!)zP)NW-SHBO?8-dLfoOcycw&j(CIe&83(utJq>gy zFV00sZ>_`6*iBe+PlulEZ6|268)W3`wt{6(J@Q&kLd|;m+=G6?-Us^JAP6Qq4Jej; zh2nh%G`)eZ(CvZ&mCyATo@N=)?+|}sT>uBEb=GMoG|#R_IbYigk6PEKgeHDM{a)-V z{Mt{@+)i9MI9i2|}`O11e}4AWYrWfYq2Cg`*aR^roPb5ba_}M?Q8E#&%#04g%xi|EdAGB`A8(5Pr?U{qv+vja!NQ{L4Y{X!3N2C;4O#ygB&;~y zkl&3UVZD7L+O;)Ucr~LDdqVdW+&(p;g5CXuDjOqy3;GM~CK>S;agZRS7;(kJh0Php zte+Yoyjs(k8fg3@6h)eF%Vr3%yx6e&e|5bDTvb{7Jr07XsDz3gqoNpNVk2?S+O&a+ z2zCv2cg?jGyD>1aMzLEEML+~wP!y090}C)fRQ#=TFXznnec%6oJ|Ab@%ROhG-e>RU zSOy1Zwf_enEj#5=yoUu(2GbC7DCrU?mq zi}apPG>@dW6q{?Gx{6)+T0iJ6AQ1%d!yTc~*0|M+X1CU#ofY zCIf56Z`b(0%4F}pOY>oT7S#ziXgco5!lB7qG~e%M;mp+Sn#*-xV(E>onx8wenb2CP zDckimK0jWrxqa~sR#si9vFMb80V4x6$HU&SEMTqXb9Wj81Z>pw+5CZThfSK{H$IT3 zu|w0Z+($%y-KlwLkW0-??Lp0|+WF*925D~nkevdKYNn6)O6~bG8tYr%uu5}H(>JvM z+wefsj7-EmpB`(@+$*4pXrd;Nud_`bo@<<6$*;9%nu3OfJhEiX-L8dveWhu_dlq6# z^(-AW9r#-J_iU@0WeRK)9V}Gm!CBgG7ESH(lwn( z7EHSTN;8+#r}Uorn)i3VVX>8w6w2=orWK@x*ag!680(uPg*`Z`DrJ?~)ShnCX4`EmGkq>0qXB$mX#=2D|qF}V2IM*0{;c2s2>sc2#hZq8^Z zm1-V?nyngYrM1;=@rMSIu}d`UhSZXh{h}z1Uro9?<`#`3ETw&`NV3ecl$u|PV>ZuR zI`}Y-ltgoBbY2{nx0Du`-_c?FmU=wQ9Z7p&E+vn-!vu+$WW4PTH83nB`y}e%SXY)h zSGmhu*i!mq!(BM6(pHqt@<`k=%%qbm?on*dT#Swmx7}1K^kf)O=3bsMjONX zIxMPtA66~RrH@_pxO~8U-s9$y?;QQ_-2(M!d{K|v;;9w)&|Er}cOM;6&7}709`Kf} zA{qNUM5cDGg%oc72(!a2rNKpyP~ESxbi2c2gio&}&2Ab`vQr%?uXiGXq8dv-z9;b^ zYcEw#NM&~|q}esn(BiDKl;D=eXT??egSjZ1HXhR0@p`OuE)A15xl2`2(_pg5Lo&OU z&Jk5lY3k(+N|E&84rHR;y>0`f*yWjQXppqJE2We+4wZ5#VA`eKP!3Wl8`RuSirkt+ z;*Yna+$(yvcJiD!`cxR=j%6&_ImJ?yb+_4v6i7AK$I$O0SGqhnhE$kO(rR9LueBc~ zzn3vQuOFpT!zm;b@K(T_;eD2oQW$c?izft~gq zNvtN26_9M>jgb62j`SEK%(K3O!Tn3|sn8uj;E#sJ4Yc;8a~c>_lFqxGMTJt8q_Yby zlQ>dYN}h9>>9ZBeYK}=UZ)X;kEGzS zGiS;A86horaFRmJJnT}dn?^yM0woLG!-XPjo{0IbCPD^MqZLIt@1%y$O6`c?t7%i*T{;jbXdh+ZfD?8 zVS(hg^c3 zatf{_Pu4YKsdSeG#cKmMs#x{=W*Aoum+H3Pgs^ruR9stztVeD2IH~H}HSoFrR7HDg zc3Aknk~&*2!&UcpDn2_o4F-RhlJGZ$Z1)N(?j|d*d5jgZ8jVHM`Bhas%^3R8Tjr3p zMP@lvP*E;EH*fJ(I=g!4oI6h|B3v1O2x0f;e7FgNm*NOqA43x@N=D8ylKztI&OKYD|g^BcAIqrF?Zsm z)l83+S#(FmpEZt?$bL`S&7yyonQv5#^3pDb<#rQTj+leiRFHY^HTQy*B5U*7zMN+TR# zqouBP+4runDZx7-qcE5Z(%$gryRDCkr^$s~jbA6dRc#DC#Hhm^w-bk_~-m#L*i%EUW zoiP-iU5YGHTsu;bb{Wrr%m$a$LHf3wi5pfU@K4?p6`wyJiJKRup%-^l{$0Ti6t?+Z zcZTl!)5wV`mOn8H4qN|1I&acvABW(=p7EIK)?bT5jVCi%(+9(nC!<5t-WbBWd;WDV z9hP70g8Z`6VO7Hum)OD7JKa;oiq&W6{yuZ=4)4Dc7g@`+O5IyBbBKNyA8j! zW6ja4>{eXi4+=I&-hvujVc3T47!+-eee4!4MQhRH9ZlghbI4YfCFim!Cjw?udedRlH+)1Y0(r)*aDH#!Z|J&9M04d2Eg} zLQvWT}7aV{4MPxcVGVd6yM9RzfcyH&8`nZo_!_x!+&7uj0iff znBxp9ZQJvRYxm~>tyC4rA}ZO9Uq}j$s-KD;moG`XdzKQ>7mrI7$;ml)ZnOF_lMCZD z9TWK`7`ZwQ3d+66ii@Eb**p{(%o8Xmi|xxv(Sdt+;6t~ofj62POI_MfyE@9H(MsM%k*I%z^c|1jqvR3NF5I54#<2!#Ae zKexDmo)n^~P%2!-Ar!c|eK8zw=VhSwu?GrjVLdMyx2RrLiAocuuj5s`MVA^`=Pi)+ zIoXr5R4hBJ0ACAVp)#1s{;Qj+f0(Y{g24W!APyM9g%2Y!!oswV^`WcJ;?cb^R z&8?gW9;&4v9NBqx+Ef*-cfG~^f^-aFVb5A7suX;~J(o?qqA9~B|6ReqC~C88R|4~a znPddUsF+A1mi%4T9?Qz+0hV9@=Vx_GKcx;Cscc$Jg8l>X!%rjO!BgCMOIh*0O}vVY zW|kAnxq->QOvJdLB-o!VBMNPKwnmi|f=4`=f^wU#eN@qz%a^yw#q{8EqW6Kb97=nBBO|!dcg0 z;}L6>S%<9PZz|q>Wo~g9lbr*p^QGXTie}>Np2{L?8KoEN-Kf+7lrk&YNlArj}R+Cl`g8sE999s_uDrBW`b558h06|U@)zGFOfh61J( zV>0EG?uPy1WwBK;Rr?*jR4$o&kOjX~Dp7FpXiE{q9m+`a}XemGc(+CvS*z!g=6 ztR6E^Tk@e!CX+PJzws2%Ie4YMPMTMzUJuAWb zxt5~U?lPiL-RdkWFR$W;{x$e?R1~K5>WbSG`B6}NlL?32tT;9?tS74Snzp~#K(ysG zS8#oPLot(?uFcyUimRiE!@Af5?krrrl8^K zHniUQ3Hf_7-kc?KGO6dfJLjm$h+l z%5Etpcfa-@Xg^oZx3v+bfu~h`)w&IJrjF^pAEX6^{JV@NW2h4H`#4Va>>%cli_(n^ zSB^Y_9A?T+)INYvrs&htcB`1rymR?cyI7gnN{rEx5UKk>9Mz)*RVxCqZJsRlu|>th zMs0*qt!)@_w3!IvsLpMNtbeo|byhVIb2*sHVQOdK%lRs9V5+Wjz)aox@hmTr+mkUh z!CI^joT6Jld)Z(eYUK~z9RCzqtXtBqYA(LAi4yhPtnSgPeVN8$IhG9?5Ov&hQBv#h13I$hni-q`RO-H#$h-8{iLCkvs z?;e#|(wc??Ob04>C^Qdc6Kms-$)E6QUR4$2dVRq0foAAzoQAGrjhL58Mg0Mc6#SEl zXir0GzrB14gKgiW;u0)!NI)e{)O>XWhl6yN84S7B72uLlFt~56+B?A@}d35QsV5&(g>LH z1MNAFRq*wlAMmlhB84y`8#48wiW%gt-y0q)c`YaSm}7OUu2M!Ma#&k}TJ*17PK3nN!uqS_L?P>CiA2`jnqGEJkEH11n${%1YHeYh3E|yg>^^=)!)AHIh>Q$bJwoFOEMZTs& zyYP+_In-P{G5am~_*n=igHkZ0l#@9q%BM}xJ&Jx@h`_hw=mvQ(@;kFTO~mPI{7`~(QW^^b zzV*C#ghe%qRg_Qd!?p&(ty^7jiNdrBb{ktqoY`7d$Tyq$=+Y|ASXW6nQN(Y`@eP(v4%pcd^kJ1x;Pk2U&TJv#MbZvC|I^y4Pm|I5-qctA5ub%rc@O-b5CPG zAGhj!-70vfYE_Xz84|g@jx4rO&^63TRJf;IL2Jtz;zj>CD#mrKDF)|GK@$#@qGpa^ z2&0Y&Yc`VBn6<_E)WNtCR$Vw(7_MS3Pb)Eb^AJ>9ZzXO;j8@SjsftKjHWu%-Rm4-j zX(~=@Sw%cNu@LoOAsT2&Fw=b?E@MC7cWN~n4l@^HJFZu;BXx%i=#h1nqvBSb{>9VJ z$_jthVvU|vL99Ixq~cjSOEK@$5!`rVE?SK~recfH<%ONcalB)`*=Ni-9cq;iGOpcC zK_jwitDLtGHeJslj2%es`aq|c$NxDa^`KJ`jIOlxu( zo8O$J{Mkj63Oxg5S{_)-fw=@Pih$MeI0OY{I`m;q;aB*CVBUF7{Yi`VBD+`?Tsv!j z<$o}_vp#g-^YI+=GB02~E9RPXJI^}1qxf#dj{Co`DEuI+nU5&jGlX6y!KbAkt8xMu zcJ_nSo&e@Qd{M3Q3SE)ltnlTu?eM`UpQU8Ty3o;KiHbERx!|1rQaDo*W#!>zuwL$h z3oP2oT1I6Y;;gzo8DU-xrG1@D!f5$hk4*v80`nzlJOC$c{3w^q;Q2FOCRmrl-n5^( zwbS{Fbz75B-db}T{npaf>$g^+lzwaP4XMOx-h+Ar`mM?B>lF<)ve)T8f%eN;mg|K=+hvfKm$A*t-a70#p%3KWWt5lqBFgK_zsv0^?f+V# zC>rR}HFNmQQcl-Qa$;SNeU1Takq!kPSNtfM(#G%L!v>IJ8w#FZX{R#-luZF2?@ouT zjXtqA^?UyD!tA$M48!+@X5mXF=Y}EqZ8np2ld<3G#s8pY-)v5Q^zj?Ar~?`1(@Nys#CO5b`moe_Q%} z6sTB@J6z@dS46UWRQ|gjhZkT1YqH;MBvK1|bEjWA=g3l_MnZOwl(C+dBUSoJi!T&= zYxBlPjHp!`2BR4td{>TXobUK=tg$p%D%|{DJ)?myHO5V~YXg5ta^yt8lPkVSsp35* z+jqq%&NUV6UP|b`+c~;HUj8)?&!FVIK9OTk42SRJ`BhM^mZg#;{f7i=ZgW*EJol&W z?_assy_`R2vardEw>5 zE^XKe>m_3j2U#3W57|=`(;vy-=Tl)qM)yCP>TpfJnrOpzPHn1$i`>rRd#1SU(u`!v z`~s=y3Hfzew$h#ZUyeS%T^F_tYb=ZQtC4ZNt`mS*|m&nz|-0f*Rj9gmX*5P5vzdvuO zp+1!%nUGYBpe>o~yY9x*QG!}NMIBkB_zUmOw8g46MO?WRv#y0I9=2;uazGKy0&Td1 z-zjKX2N6YulmVzh|IcsC+gsww$)LfrPL$#%LFqQZe1_*ITdSac8zoYaT&lb{L}rD{(T2>ysmYsC9Sv`)@Bn?RMtn1*P8iqF+lp6a*iDp+Q^7 z<{0S@YE$*#IL7iw9x_b+nF3)OTb#w(_m$`gcL}>kn!|_{Lnl(oV|Tr)FnVW#l!R+= z?O+0jCpT1lSj`wcSQ_Nsh2Epr3+ugYx`wLUMF5sN=%O@U6Z6&3{HQ( z7N>iB6s)`KrL^u-DIufmKcV3GQE#N-`$~zl2U*gh>|#9WlqT7)Dx^+Eid5L=gNjP~ zzZxoUiye)b+z)K(YFtBG>p@lB+g`zLvpz{n$by%BIv&K_p^w~0>0?NSirEj}vO?_+ zwHLCbot!P1a_0?bcPXzIGB6z4W-p}+yvr0EeD$n!&G;eJ2JTDE!ZKBCG6UqRQT`VSwf*sM&r^gQ)GRez$SM*eqIJX9-7x?_2hiT(G| zPl_HXxZrobw5`uM9OP3tF6^WZJ%}a|b#=oW{Q;Lcg+RBl#vQe7n8JTBi<&(ZWAK2Q zEe*@Zz^(o$%vu-2l#4&!Z@i6l9sOZ?={EgXN77L<7Ww(ZF*+|6SN05rS)Dk9z8!=m z`{I!6I)Lt+aadlyKMJ$r=!Wb|b+0(8vGqfjEwQNous4Q%y-oAT9(?{|nCkbSYuGfp zT8(kX$&NAX>fN949}+BKi1vp)IeX!B8K}nH$fu6^_MyCzB3+4N+E8DJ&C)@8_m*N5e3G%M3g-3PYd5 znOJuu6!*0uvtgJXisj?x;#A^geDA|#PVz+*nJq!s75Jn5B^;l^^_E`3mDFW;_W2Tebzg?# zmX{ILXc^|dy@c{HOOaRRGPJjkbEw(>D*SdVhFwA^?iwz{j^b;Op3K9am#$;E(>$E5 z6oF|A=HUG9o49gr7JRZea~wVkVSbUA6+a7&c15D`yjkdB6OERmX5dcaXr$bqf~yYE z*gt6^>^(>#qh8?Anb9b_W-P@k_4nMbSi`_C9(*;{ITlV&i(zoN70!(MFjNi>XSMrK z#Ds>^>R>2FP=vzn`VcI$yH4)V5Y!)foj2=XoS%K2WQD<$8M{tV1BwVuy-xPnAiQ4` zL1{)m4(}rPK=;9W8eFd0--D725#%9u=g~(XsfQ=ZkBUHphwfUq9KM0Q4_qihbpxHp z0JHa8$KF#;%!`GiDl`n!xMb_zsS*^9@Ue_GH&xzyNn|N)8l|u+>ke z1n2Y7kAA)1kQF_I%35zdnWn#KLEaU$KNa)uU12ARkvO6gUQhl>A(W1|P05N`6b`z3<~u|E ztuVg!cbziSY!XPl8#chI`roL#P#@oye1){HE~5H=VRdjFOmFg;DMoE=^r2y4cv@Y) zYxBu0{R8dKoY&%U~6LAPpHO#bj?Y6wD$jm zcJY5ON=|_yG&!`Xbfw18Q3P;LL*eSeWC3#a{1Vrp@e&zUy+3cf<#O_kXL?h>g>{ zVgKQaD1+B{%ISLTtFQ3&moEmJzQW|kzOa6k4J$r#pJK8x=8PYfAI`=pS3k^LmyP4S z{Mh4WVK<+x?l&_rj4E^PK^at-8$?&j40PBth~|SCd@T$@%U|ix%DraYM(J2rFc{lo z(@?L`FmhE=NhRfrFE|ye*9^z>KFqf`4aW(aRAkH@j{RF-Fi0j_1l|n|wUz7_8xHixy0$bA-P6j4 zr#ziOiQc$il!XCaTr&z_j2@)avPi9|4&da8SaU6`AbhBpSYD@_nVDB3LG8 zQcl>Km4U~Z4pi>VL>WVS#N}lm<%%8Vo=->Jot?=BOvB4YcCdb$ii8vPxZU9ez7BGr z$fhFVX@cXdRt+BCtB7ViTqMm9ZHm_|3kGoHCc4|v> zSoaimTmHlY?U5%KUiwdjynlj6)tb>;>j`XEQY(3V0&e`a!MMARsZ-b(V|qQpX`5zv zdFTNyx;4Y`HV-hiS2MJ|eIL!|H^Jie486Uz!KL_nIK9FK*V>T}KHG+8WIOgZsUBN zPRMQ_%a>v&EEvf|LqsPW^^C>g$(`BF#lq}BXDzNL#A0Zd&KPMBha7U!yl%!}#!8<0 z*gJ^%!wyq--^I$~UGa4GJ=78o=xg)6-`m?e2({(j&ad)!=*NLp%&|fy3O# z2rhEN%dd}6zMCgbjDLhaYrEssAFPh9SrG`Y@UEahj=q?Pk;l-cJ-blpmL{PsO9(sox*$JW&0s`Fco{YD4cX6QRG)&)q7l$8CL-3P(*p8We)$^LKoQ9&Zvm1Sk z{Yev%-YOoKKTo7pcs#rdCvrFt40pEsH#{Umnp zV<@=xoC=j=kX-J$J$z1%#po%|(0lec3~cp`im~IUla|PiWgIFkNn}uA94Ez3+5b=A zC3?cS#zZJDt-$!c#&+6yBM*`VP@SAjJ+AH=gxnRCQGsq9Z<0B2D8a4R00&bKI5t{` zmQ2XsCOx|@`J`K^FESf#!B#eOgpLziw=Y0dTKuqFM@3oi!;5-$vR+4pStC@`kkBWesWx=P zn93cizhM_{rH|wVJczB@*^_i1CR0vN{)3FCr|yM4xeqgFe-r$d7v1eQ;~ZCP7Pg52 z$bKsBpvhmk3O*=9TR|-^%}g%;t*is8amVcTcKsh*K$7y!zV4_-;}r$9@`n+p|6w@Q zjsf;#nE%^f#o?r1p5nE(*?$x-H)vFpcm!X#A-Tall--OdI)I3;bs1lzsTldI6Dm3yiv zJC97|4s0&mfS+&e5X@7&{7z?e{gQU{uAxt!4W>i46Lr+|C|hB$+!?QT_2_n?ns>EaK_jPv-NavjcS4gUNLHyS!Wi+moM&^$bwSOlzIB z2GzFhI4qjRoh#X1;08Zq8|}cJJ>fWG8x$PO@MEhFo6tF-3wBdPI=)4FRM@lzwTs## zp#DZ(l=d05k&UW0M1ye~FyNCl{CL+Y*o9W5N#z1KD$rx(jaqQJv6UI3rpRGp?(nVF zu-dT+HOy_{_H(ln2UM-mh~nGl7zZxpzZHdbyI?3+=)nyaH4W7LzJ+19DM#Hg=I3Ta zk8{TLX1kRg4ooa#Y^|+t(HV!E2SdTG+`5(75!6^(O{d(gpw`q}r@wZOp|mHy!St`G zs*^|D^r1RBQV-+5(Pd@>OdWj$e~zk;R@BOQ*zXU@KpmxveQiv9d|bgA$_GrLtg%1k z4V4`UY&*c%R=d%vvT$tw20iJ8wYFLgmNcm(R^QFxz{66U9{!Gj4JH{^l z;Y6=M$AmKX!{nyxfMm2^;;yzRur|?zroP06-Ae**C=H6^JL;HOj%n|%%FjC zde4fYkQB@76qV`vAPd*3RHP46CZ#ONT8#gYfpXSnqLyPiMt!U(qEDw{`>TrL=uD2; zFIE(FJW_G*Zbczz0-u~wQS>$9CQ3?CJx_8!bb8jIz3NjHpX1c z^-D%|*7puumW;Yq7Ti!W=9^oHazB%>-`+x`E=@u~ADZknPJ;hB3-PtZa|F6riib8y z*u2kDoZJ1J!ts?vyR2uh-^AR$^D{K5P+9c4_Y8}lRTe$ZKF5_E)O*oJC8274E0NGW z1ue+69Af%{K`Se9qQ-%5<$#yZL+R-#dI7A%HZ3HQ7#>}X>p`kB3i$@3~AFe?ke zZ>oseVeT(6%g0JIto0g2b*qT}=U+p)Cju7?GH$Fr_>3ob@pq&pn$Zfe0Qn8fgxQ2| z*mm5EjK42y|G%X)ZMBT;J1DR5)9} zP>ZFg+r9`@J6j6-okeILZXtGz`N4#NrC9po$1u8OS%@Zo{(@UC3vmIzVZlWCikSwY z=|FSQ-p4>7-b}P=VIW*t6EVmhrffBl1#J2SD<{RfYq zcSzqNCa0%Z~ zvq^ICVnu?S&2TWKtmUvw_Uk)!UdS!z9H-5Bhs}J)9%wJUgY0T3l5-%t6;2{mTQ+eF zWxA}q%}%8A$aDA-AJsUA;_GYhkrYtnOeq-nVF+&*w?!M_(d|8@%Jpb)V-u4_tUToDsvFKDIk%bv? z@TmP1PnX282JQ)s9g^{2R5F&Eq+y0p+AusDoQ4Ub(lC<&gC3P=?>O-ua{Qkm>JKuC zik?!i>>PbAp5gI?e;B@dfzS62BZu>}UT^j=(UOHGAwlT$Jd0ZMI}v_8OFayvU{+<&u=JLdD>n~B=J@@8*T8TP(|74@-iOl+>eLv{2Y^;x%OJvH^4jkFrS6q5a$^EL?gu6p2|+@r6mvnysGVW0^N_ zz8H@?ObN;!XDg<>MfbB8V8UFj>|0Tv8PeSShguX}-Lxa$Y=YJ2HtF6Y55Ve0-9Da`G+@hhSsHZ|J(} z2&u>4acS@&tSwW78MeV#zo|$)5aoaZ_fI$e!$~%mmd(o*lpS9`zUM{bIag+J zfX}i*7k@r=aXq zzLR~se9zlbKgyZ*!6EF~9`If8pxVEvEU#}xwquju6bj0wIxEPg*u~m1gMIms{eyRs zduLj(6fe9#tEeomZ>3e8BRJZjfMYj3&gp!DRv_Q#8FQSIghGrTb&N+;!~xY2NE^PZ zs4TBY)%{j*?`!gu$wDk%a9#5p}_hlxAo?}MjMRI(S@jl}$0^0nG z%JTYFWZUB!(|<7UrAPVB4z2M+*NMwSikNr%af1ECMiRa(JN=8w@`1lcQ(nFK5qm~7 zg6Yko#~zvO;dtmc6X)~^p^Tb>o`D^7G=N3)3)xLI%)Nh6ljnvOCE+{Yji~hizqFUT=5IF6WCj zP2BPIc3=3IxicE>jo#Hcg)GIg+*=+vWY>#B@$Pu()q^Eh9t^Iy<6)-EXK>NNeS8nT zD4qFW_avuCpj=>2^lTweI>HOJ=Snbt)*F*|YcOP)H{ZTaaIor&zmGX$5H~WnodZUM z_C>qF4ro{GgFiPpphhb{tm)@~^qM5M#XHik$QMU90yWnAp#Clwtm@{Cifi4`t9oBZ zceEbp;O>pCIdo{a-G^cHZrDH`n*Z`%u#D`5zgPM2J=Tk($pOfj(hH&I2hhICi#s&{ z*K@p(`iW;|RWA%MAIgpQM&rB@q(^#lzB&qZqPVmixvy)o(6baedEi>Gcf63Nsn-a833 zuXabp6B95!+!NRKjziK&Pi(&iMs$+p|YB8Cb77k28O@vJ5l5K$g8)b6W;QkYsg>=-lBeTdH#!koQK^}b6 zXVU?WagrmmhtVBS=>Fi|ts_iX&?BSVpp1o#uC=DWPAr{O{u}$v=?L?RLy${rh{253 z$rceZE*mFd1(#P2D9~`WF}!M#dp3zR;tJNVZp)P40#sgNsdF4t&}jx!h}H}7l&7V+ z&0g{o8{yvg1&l$vP>*9V z%jSLQJhoI_Pg!5z>ay}~q_Zqy8cvTPKRZ*=WFE;+)lu4KzKU6mn&J=Vc_dc3lTXGW z&4d1U^mwVdp0d8a)vN9vxcbi`$~5S)mAwNJF3%&$>kmx5Jx9f5&08^~I+sp3o*Y3f zrnYi_6pxhU9sYBDeXHVK9CJvkNC?zpwHmZAT(X+>LUDY%tYRuQ4jm>2z-Cw${@TT3 z*huU33iC;4dBuDtABY!sXwea%uCH&^<9!THFJ4WvAw9Y@j^R~V!z&R3|EjBDMmpK% zva5L1X$+RmroUGv%|K^U&N-9OyV*=a-X^JNmAbyZ)dQuY$vjxYF{&Q59#P00wU%R^ zD8`i5(9AFj$?mIBHibFZj`PTPp_0t&St@3bz<=|JkA?GTlgfxbbg*7fP)5XXg7tq7 zq~w6~6R3J$U-9YtM8^$1*6R6^#KSzKJ7&S|)Mpjv?s!4f>|c;99zl*_DA?m>7~>sA zVo=%zRERTH(THjQroT-@&&9zAIruNm_udV`vv=;^0r_kWQ$C3N1Lsj?or&lhe2Izq z(kd2=ru^b8Bk{xRHUliB#P9QQ^jS0%t~`zM6sY^96lTnSVl&T5F)5o1dQzU21trP> z=>|%Um+PLx+3eC(iqxZf*d=tnTUwmFbP={xi}OBr0fU>B5p`CvY$3)(#ggUqla~CO zAz1OZiBNFF&@(Xm%S4nLNF_*?nN6T1K*Pu~qF>7sq=x*9CClp@sj@DZ-9s6gEbH-5 z^P~7l!8}u&BQV)tMx1VN7#6H8oAW&wLqC*Jv1ECDBhmCaG;uE@6r442Ki0M?L&t!9 zSdm&r4CS=dprC0|}O`{}U zwh}B^Ue}0IkIcsym{!cUlpg1`dyZ0^#g7X~L|_L4vF7JfO!qVtuO`Q%e~^KS%JTZb z@HDq%d<-JHrUb{-Ph%%Y5=*6YWH$TBPB5K=@?w-vOvb2hKUGwg*WW3L4Xxy1^) zMTFzVVq@_!>>A#+DJ`a54nsnEX~t2m($w`|ELlF#aH_HJI=1mSrc~U+zE+PLKRm;w z;63mn9y_yJhiTV?aBtun&R#b{G|#1H*?JXUe91tIn_JcO11G#QYNVCjF~b>HQ_v&m z6IL+ZCHn*waMq~c-lX3s*RcSPdjEu6ps(N_R+lfCY$`lxN>f2HRB<5x{(^LMxxE*B zgcMvwhnBTR@?iOlOwxCG?#c(q5(RSS5Lr48`dG-I=aecQvni;5UlA;x?P63MArUe{aAH#E&jNRFP99yRqV&t7-vH^ZU)(Q2O zOU8*Sh*#+_Ba_^f_4TcWKR83?#1|UX>2V@!QzqDa*4dqUqPeuq+?R4l6Yo>m1hBuKoc zgLw_!cX5!FOxv+mT}E5t;Nf+}$X$=r^>wZG^kRrX4$LSh3pHI>@>>@k?OfYHoI9}v zfecT}89X^cC`*f+q(uAX5|pcgbU`G2JGwi%=d?Egx_d@J5z3eX8>z@>&)0_r;^~_; z=)-QgB7?T&_?GL$d}RSE(tL?!g@u^LAg&zXDOtay(Pv~@au24JV8i2!af?NR6=_Is zU2Gt}JzIvwzJ|h$$*4ICK(!LOAuO^eTrpGsS zA$(9@;OCAL5aUuvlM2O4=SOHY;Tdr^8s0G$A>FpC7{ugI%&xWS`ua;XV+nmO8YZ#2 zLXQi2l5tw~ISzcihzl#9agEFP>qjCJ@)WcE9*C~4^+b^VAm08I2Ck2y7sykH^06Gd zJ;g|3w$oLP7Q@u_^{uX-8blf6EGUT3U1-!en{k)j9O=Jgdh{@g&u74C>lv)?eHA_O z8PaZjNr&0QJC9gQ*5b6fzP{D)o@@BR{Qw0AuUbvM>qnl)H3(b!5!*P|%HBX?+s0t} zTRmi^F_QVEcoNzoF_7rBAcT};GHOcN(YHEy=Q8r~@=2S}WAjT((eT}8Jg>W)uEd|2 zs|&zBvIna^=lS<}%7Tdt-biNud%7c9%8~5JYP8NM!F&!--8fP%Szp&^kM@H@sVGre zD7fs$ReU^eEc_3L@z!Q-ey?yiv@It{gbgLYCdw1 zZozlvU<#(ls3o>3`v4ik4TQ43{@TmEVg}2w6%^Dwc0PJszWN0g zeJ#Qjhcr~`^Mfk(>7lsJVLd-xsh)Gt!k*N@<`DTO5u zZxjqCi%EVLo9zEvmzdZ<;z{4XONlJ!*(hlEFP1E?AJ@w7EqS)5;1Wjv<)>`)qMf=2 zMov!73n?oS$=IO#*N?EbpL{OuyIKGR7iix} z2eJ#vM9r2qWPV3PT$+@gR)j9+pGkd}d{o2JaveJ^`=66Vq5 zqB>;{Wt>c|j_tI1v^DF&9C1SxWiHN=ef5;}1Ba|OZlpcw8ize;^j;ekhkHMrMd#^p z=<=tFFuus>M@tv6&*Kixv~^*Y>MrhkyNG(ucad7bMJ!r&2OS#IDern5rWew-t40jh z(+J;yTR2gH?i`4Qu+xasZKKh3uSR59MdL3|NsRmvMX`NJxM`xXDgdoT@zQA2p^MtR z@iC-=3Q?}>Z4zZ6!p&o;zbwS)DX}P9+gX(CsJz!U+8a3f%~e!u8UdGWZtUSB(0jDI zXxi;2434^sZJ$}c6YEZEy(m-~;4Vx%M&Ve7o4B(m66XtDMeSyhBm%mK`neH|j=6AN z8i6^ME~3+Smgzik7R3n>kWM?(*e!y2ac5Ds+YNZf3lY!3>e50Xj|!2_a2gWae#1Y*JZAWYZ` z-t@b0-CT&oCA(miN|(IXJ8^23vuGH)6Mci7#qC==@jc5~*pAqVwiYf!#ixQDcBc<10L#{LX~(PtM? zw!&^yrFq|z>bqI>?jn4`cf+)dizqp;z|LzKls)-+If6nYQOYiW#4wErII|kd;3PJ7 zUyb_v9E7*+Y9zOD5G@V_V9Eps@o827itjpz(>GUQyT6mj`nnw6o8|SEV&{HIxJE3d zei6jj+KX_muM7Q<7BZXYA|jeCrH7gjPns-8kqJb}b_0{wGKc>laRyGCI*A%lGm)L{ zNY=_s8oW7*v%6>F^%6(1y4!3tPje8xx6fsfoP&tkHy2rJ?L~zHa}hYvUU(MF!9`Dd z5k6!NVc&X=8vtF$*9JD=qb)iiG6 zYST%0;HVM1tS7+Rj@Rz&1f;n_w68l6zP-4&HdA0SM?-VEDX2c4M;kE>N9$_D+gsC6 zf3%Y*IRL%uR=}A6rnubr2(7|5H#bpx?rIu%x{4)3S0iMgEBoWsRN{7_5#(wd^l}ja z8LQyG$3+Z{4#19buHxsF<*b`^6(8m=$KbXe!gSVhWK8uC-KqtUujkHFt!qE9*Lvet z+B;LWQAbxpO4v56k8=`D#|Kj8SR)GK17V-(M3=zr&|G#BOLDi9kK-gJwcUaHt(?TU ziaYVEtD~5*dlx(>If!@)3?~e=7a`+!;?J91#fvt0J}{!OcOeyR-#=&vg(9b++K{7YA16 zY-ZxoQ3P9UM%jUmqVCmA^i_2f1=}~VvXXxi;EEYdmjTNu>!Ft|$xNellDO(S%B#Fj{H^4hoBVOIuz*+?M zTp1gYe^wIr-fu+uDM`du-NX)D67{G&ocvrOg<})!uS%lDrcD^WPZB@hZbAs32pJb> zB~sEh;h>X5C9X|4+ENk+Ew-S|4UIVWYcuvVaHT;b=b0lzorI&+R)o%EutTyK^D$Vm%+SOaJy(XJu+2?*jK~3&WRJHUb+bfhYI8PO2jZfRp-eNCB zIIZsc30Z`*3Ni5<1Ibxl%KG|7AN0GxUbml6P+oY7eGi6VFJMwmHx&m{VB5vPo4x%% zsLVb4*5n`E9u8#W)U;I}Wqp04vPiOTo|{lmR_C_Q?;#rb{G;2Lf-+0z`N>}5I$6GH zfjxvQvMl4s@+YvTT6bmrz`{*@N0Kbk`K1pP67?t#E`1HX=$;ycsIom(G`kmsh3&hE ziJb85it<$P@1nh=IJk=wBc>S6-s z(LHo%MqJT25Ks70ENMr7cg^~H8M}x+LP0tDaL}R`13jxrGwY$^#NO)|d~_8}Lsrrg z$Wuj`vtreuCspPav5ca(C`+^_K4D;@(zsqqySj~O<#A?~eJ}R5di-PP66{{@E`C*6 z3di>UqReqIyWlGF+Abk+!Cl2B90#@8-b=V~98`O;w~)s}6=WoNe$rH4r;>Jm^;Q_y zckkZ)?IifkSY};!-)da85^I0(rgF?wRE$5)7(x33>%Fh(!VH=*!Ok;iR;yzu-&uxrsFPunNxehR7=2Mf~h6>FgjCT+qr*yg2A2WK0a@xPe$U zj6P`Y?xO#A_Tc(<^o<&ud5YvK?Sz6Ru^N$4vn9=2oTyjXOhtoSPZ9O7qma?@US}N+ zB`#^wP4rJ_udJ_Y)T?M+Zz^kMkTR#oe5tz_I4KEpc68%7fR$b)SZLQv4A0G=iVXW9 zGTda(%F)E)kY4|>exQG#@gKGedisdoZnR_B)Ox)5^dD{48@uK_d>{1_3d;SL&$r%U z^JVH5o%0QBw8OY}2TN<-kvn(na3JtMH%b1#{(A=B!^(dP9Sx83^B+_tFevqFU*OUm zB%~V{xN?!QTx9{#oc}`k?++@atS3$e11 * rhs->e11 + lhs->e12 * rhs->e21 + lhs->e13 * rhs->e31; + m.e12 = lhs->e11 * rhs->e12 + lhs->e12 * rhs->e22 + lhs->e13 * rhs->e32; + m.e13 = lhs->e11 * rhs->e13 + lhs->e12 * rhs->e23 + lhs->e13 * rhs->e33; + + m.e21 = lhs->e21 * rhs->e11 + lhs->e22 * rhs->e21 + lhs->e23 * rhs->e31; + m.e22 = lhs->e21 * rhs->e12 + lhs->e22 * rhs->e22 + lhs->e23 * rhs->e32; + m.e23 = lhs->e21 * rhs->e13 + lhs->e22 * rhs->e23 + lhs->e23 * rhs->e33; + + m.e31 = lhs->e31 * rhs->e11 + lhs->e32 * rhs->e21 + lhs->e33 * rhs->e31; + m.e32 = lhs->e31 * rhs->e12 + lhs->e32 * rhs->e22 + lhs->e33 * rhs->e32; + m.e33 = lhs->e31 * rhs->e13 + lhs->e32 * rhs->e23 + lhs->e33 * rhs->e33; + + return m; +} + + +static void _multiply(Point* pt, const Matrix* transform) +{ + auto tx = pt->x * transform->e11 + pt->y * transform->e12 + transform->e13; + auto ty = pt->x * transform->e21 + pt->y * transform->e22 + transform->e23; + pt->x = tx; + pt->y = ty; +} + + bool TvgSaver::flushTo(const std::string& path) { FILE* fp = fopen(path.c_str(), "w+"); @@ -45,7 +74,6 @@ bool TvgSaver::flushTo(const std::string& path) fclose(fp); return false; } - fclose(fp); return true; @@ -137,6 +165,19 @@ TvgBinCounter TvgSaver::writeTagProperty(TvgBinTag tag, TvgBinCounter cnt, const } +TvgBinCounter TvgSaver::writeTransform(const Matrix* transform) +{ + if (!transform) return 0; + + if (fabs(transform->e11 - 1) > FLT_EPSILON || fabs(transform->e12) > FLT_EPSILON || fabs(transform->e13) > FLT_EPSILON || + fabs(transform->e21) > FLT_EPSILON || fabs(transform->e22 - 1) > FLT_EPSILON || fabs(transform->e23) > FLT_EPSILON || + fabs(transform->e31) > FLT_EPSILON || fabs(transform->e32) > FLT_EPSILON || fabs(transform->e33 - 1) > FLT_EPSILON) { + return writeTagProperty(TVG_TAG_PAINT_TRANSFORM, SIZE(Matrix), transform); + } + return 0; +} + + TvgBinCounter TvgSaver::serializePaint(const Paint* paint) { TvgBinCounter cnt = 0; @@ -147,14 +188,6 @@ TvgBinCounter TvgSaver::serializePaint(const Paint* paint) cnt += writeTagProperty(TVG_TAG_PAINT_OPACITY, SIZE(opacity), &opacity); } - //transform - auto m = const_cast(paint)->transform(); - if (fabs(m.e11 - 1) > FLT_EPSILON || fabs(m.e12) > FLT_EPSILON || fabs(m.e13) > FLT_EPSILON || - fabs(m.e21) > FLT_EPSILON || fabs(m.e22 - 1) > FLT_EPSILON || fabs(m.e23) > FLT_EPSILON || - fabs(m.e31) > FLT_EPSILON || fabs(m.e32) > FLT_EPSILON || fabs(m.e33 - 1) > FLT_EPSILON) { - cnt += writeTagProperty(TVG_TAG_PAINT_TRANSFORM, SIZE(m), &m); - } - //composite const Paint* cmpTarget = nullptr; auto cmpMethod = paint->composite(&cmpTarget); @@ -166,12 +199,12 @@ TvgBinCounter TvgSaver::serializePaint(const Paint* paint) } -TvgBinCounter TvgSaver::serializeScene(const Scene* scene) +TvgBinCounter TvgSaver::serializeScene(const Scene* scene, const Matrix* transform) { writeTag(TVG_TAG_CLASS_SCENE); reserveCount(); - auto cnt = serializeChildren(scene) + serializePaint(scene); + auto cnt = serializeChildren(scene, transform) + serializePaint(scene); writeReservedCount(cnt); @@ -258,7 +291,7 @@ TvgBinCounter TvgSaver::serializeStroke(const Shape* shape) } -TvgBinCounter TvgSaver::serializePath(const Shape* shape) +TvgBinCounter TvgSaver::serializePath(const Shape* shape, const Matrix* transform) { const PathCommand* cmds = nullptr; auto cmdCnt = shape->pathCommands(&cmds); @@ -280,6 +313,15 @@ TvgBinCounter TvgSaver::serializePath(const Shape* shape) auto cnt = writeData(&cmdCnt, SIZE(cmdCnt)); cnt += writeData(&ptsCnt, SIZE(ptsCnt)); cnt += writeData(outCmds, SIZE(outCmds)); + + //transform? + if (fabs(transform->e11 - 1) > FLT_EPSILON || fabs(transform->e12) > FLT_EPSILON || fabs(transform->e13) > FLT_EPSILON || + fabs(transform->e21) > FLT_EPSILON || fabs(transform->e22 - 1) > FLT_EPSILON || fabs(transform->e23) > FLT_EPSILON || + fabs(transform->e31) > FLT_EPSILON || fabs(transform->e32) > FLT_EPSILON || fabs(transform->e33 - 1) > FLT_EPSILON) { + auto p = const_cast(pts); + for (uint32_t i = 0; i < ptsCnt; ++i) _multiply(p++, transform); + } + cnt += writeData(pts, ptsCnt * SIZE(pts[0])); writeReservedCount(cnt); @@ -288,7 +330,7 @@ TvgBinCounter TvgSaver::serializePath(const Shape* shape) } -TvgBinCounter TvgSaver::serializeShape(const Shape* shape) +TvgBinCounter TvgSaver::serializeShape(const Shape* shape, const Matrix* transform) { writeTag(TVG_TAG_CLASS_SHAPE); reserveCount(); @@ -315,7 +357,7 @@ TvgBinCounter TvgSaver::serializeShape(const Shape* shape) if (color[3] > 0) cnt += writeTagProperty(TVG_TAG_SHAPE_COLOR, SIZE(color), color); } - cnt += serializePath(shape); + cnt += serializePath(shape, transform); cnt += serializePaint(shape); writeReservedCount(cnt); @@ -324,7 +366,7 @@ TvgBinCounter TvgSaver::serializeShape(const Shape* shape) } -TvgBinCounter TvgSaver::serializePicture(const Picture* picture) +TvgBinCounter TvgSaver::serializePicture(const Picture* picture, const Matrix* transform) { writeTag(TVG_TAG_CLASS_PICTURE); reserveCount(); @@ -345,9 +387,12 @@ TvgBinCounter TvgSaver::serializePicture(const Picture* picture) cnt += writeData(&h, sizeCnt); cnt += writeData(pixels, imgSize); cnt += SIZE(TvgBinTag) + SIZE(TvgBinCounter); + + //Only Bitmap picture needs the transform info. + cnt += writeTransform(transform); //Vector Image } else { - cnt += serializeChildren(picture); + cnt += serializeChildren(picture, transform); } cnt += serializePaint(picture); @@ -366,7 +411,7 @@ TvgBinCounter TvgSaver::serializeComposite(const Paint* cmpTarget, CompositeMeth auto flag = static_cast(cmpMethod); auto cnt = writeTagProperty(TVG_TAG_PAINT_CMP_METHOD, SIZE(TvgBinFlag), &flag); - cnt += serialize(cmpTarget); + cnt += serialize(cmpTarget, nullptr); writeReservedCount(cnt); @@ -374,7 +419,7 @@ TvgBinCounter TvgSaver::serializeComposite(const Paint* cmpTarget, CompositeMeth } -TvgBinCounter TvgSaver::serializeChildren(const Paint* paint) +TvgBinCounter TvgSaver::serializeChildren(const Paint* paint, const Matrix* transform) { auto it = this->iterator(paint); if (!it) return 0; @@ -382,7 +427,7 @@ TvgBinCounter TvgSaver::serializeChildren(const Paint* paint) TvgBinCounter cnt = 0; while (auto p = it->next()) - cnt += serialize(p); + cnt += serialize(p, transform); delete(it); @@ -390,14 +435,17 @@ TvgBinCounter TvgSaver::serializeChildren(const Paint* paint) } -TvgBinCounter TvgSaver::serialize(const Paint* paint) +TvgBinCounter TvgSaver::serialize(const Paint* paint, const Matrix* transform) { if (!paint) return 0; + auto m = const_cast(paint)->transform(); + if (transform) m = _multiply(transform, &m); + switch (paint->id()) { - case TVG_CLASS_ID_SHAPE: return serializeShape(static_cast(paint)); - case TVG_CLASS_ID_SCENE: return serializeScene(static_cast(paint)); - case TVG_CLASS_ID_PICTURE: return serializePicture(static_cast(paint)); + case TVG_CLASS_ID_SHAPE: return serializeShape(static_cast(paint), &m); + case TVG_CLASS_ID_SCENE: return serializeScene(static_cast(paint), &m); + case TVG_CLASS_ID_PICTURE: return serializePicture(static_cast(paint), &m); } return 0; @@ -407,7 +455,7 @@ TvgBinCounter TvgSaver::serialize(const Paint* paint) void TvgSaver::run(unsigned tid) { if (!writeHeader()) return; - if (serialize(paint) == 0) return; + if (serialize(paint, nullptr) == 0) return; if (!flushTo(path)) return; } @@ -457,4 +505,4 @@ bool TvgSaver::save(Paint* paint, const string& path) TaskScheduler::request(this); return true; -} \ No newline at end of file +} diff --git a/src/savers/tvg/tvgTvgSaver.h b/src/savers/tvg/tvgTvgSaver.h index 6f800ee..fb8190b 100644 --- a/src/savers/tvg/tvgTvgSaver.h +++ b/src/savers/tvg/tvgTvgSaver.h @@ -47,17 +47,18 @@ private: void writeReservedCount(TvgBinCounter cnt); TvgBinCounter writeData(const void* data, TvgBinCounter cnt); TvgBinCounter writeTagProperty(TvgBinTag tag, TvgBinCounter cnt, const void* data); + TvgBinCounter writeTransform(const Matrix* transform); - TvgBinCounter serialize(const Paint* paint); + TvgBinCounter serialize(const Paint* paint, const Matrix* transform); + TvgBinCounter serializeScene(const Scene* scene, const Matrix* transform); + TvgBinCounter serializeShape(const Shape* shape, const Matrix* transform); + TvgBinCounter serializePicture(const Picture* picture, const Matrix* transform); TvgBinCounter serializePaint(const Paint* paint); - TvgBinCounter serializeScene(const Scene* scene); - TvgBinCounter serializeShape(const Shape* shape); - TvgBinCounter serializePicture(const Picture* picture); TvgBinCounter serializeFill(const Fill* fill, TvgBinTag tag); TvgBinCounter serializeStroke(const Shape* shape); - TvgBinCounter serializePath(const Shape* shape); + TvgBinCounter serializePath(const Shape* shape, const Matrix* transform); TvgBinCounter serializeComposite(const Paint* cmpTarget, CompositeMethod cmpMethod); - TvgBinCounter serializeChildren(const Paint* paint); + TvgBinCounter serializeChildren(const Paint* paint, const Matrix* transform); public: ~TvgSaver(); -- 2.7.4 From a79bf6049f30a065664645971bd5594c89338c92 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 6 Aug 2021 10:38:07 +0900 Subject: [PATCH 09/16] tvg_saver: add 4 bytes reserved area for future extensions. This memory can be used for storing feature flags. --- src/examples/images/test.tvg | Bin 302022 -> 302026 bytes src/lib/tvgBinaryDesc.h | 2 +- src/loaders/tvg/tvgTvgLoader.cpp | 7 +++++-- src/savers/tvg/tvgTvgSaver.cpp | 5 +++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/examples/images/test.tvg b/src/examples/images/test.tvg index 4ea5404e26893bfd11372e95634f7d70b891b1e9..56cc056366d57e719eac987b2d996cc37b78edf3 100644 GIT binary patch delta 39 tcmX@MUFg(yA%T#L{Gu>-0|NsS0|N#iXyj?-VQl4LYUN?x%EPj2HURVh3h@8{ delta 35 rcmX@LUFg_$A)b(o{Gu>-0|NsS1A|6^RsqIV0j5>~=B)xOyJiCb+87G~ diff --git a/src/lib/tvgBinaryDesc.h b/src/lib/tvgBinaryDesc.h index 218553e..fe87890 100644 --- a/src/lib/tvgBinaryDesc.h +++ b/src/lib/tvgBinaryDesc.h @@ -40,7 +40,7 @@ using TvgBinFlag = TvgBinByte; #define TVG_HEADER_SIGNATURE_LENGTH 6 #define TVG_HEADER_VERSION "000400" //Major 00, Minor 04, Micro 00 #define TVG_HEADER_VERSION_LENGTH 6 - +#define TVG_HEADER_RESERVED_LENGTH 4 //Storing flags for extensions //Paint Type #define TVG_TAG_CLASS_PICTURE (TvgBinTag)0xfc diff --git a/src/loaders/tvg/tvgTvgLoader.cpp b/src/loaders/tvg/tvgTvgLoader.cpp index 8a1a460..6d0433a 100644 --- a/src/loaders/tvg/tvgTvgLoader.cpp +++ b/src/loaders/tvg/tvgTvgLoader.cpp @@ -59,10 +59,13 @@ bool TvgLoader::readHeader() ptr += TVG_HEADER_VERSION_LENGTH; this->version = atoi(version); if (this->version > THORVG_VERSION_NUMBER()) { - TVGLOG("TVG", "This TVG file expects a higher version(%d) of ThorVG symbol!, Current ThorVG(%d)", this->version, THORVG_VERSION_NUMBER()); + TVGLOG("TVG", "This TVG file expects a higher version(%d) of ThorVG symbol(%d)", this->version, THORVG_VERSION_NUMBER()); } - //3. View Size + //3. Reserved + ptr += TVG_HEADER_RESERVED_LENGTH; + + //4. View Size READ_FLOAT(&w, ptr); ptr += SIZE(float); READ_FLOAT(&h, ptr); diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index 2cc46e4..a373be5 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -83,7 +83,8 @@ bool TvgSaver::flushTo(const std::string& path) /* WARNING: Header format shall not changed! */ bool TvgSaver::writeHeader() { - buffer.grow(TVG_HEADER_SIGNATURE_LENGTH + TVG_HEADER_VERSION_LENGTH); + auto headerSize = TVG_HEADER_SIGNATURE_LENGTH + TVG_HEADER_VERSION_LENGTH + TVG_HEADER_RESERVED_LENGTH + SIZE(vsize); + buffer.grow(headerSize); //1. Signature auto ptr = buffer.ptr(); @@ -94,7 +95,7 @@ bool TvgSaver::writeHeader() memcpy(ptr, TVG_HEADER_VERSION, TVG_HEADER_VERSION_LENGTH); ptr += TVG_HEADER_VERSION_LENGTH; - buffer.count += (TVG_HEADER_SIGNATURE_LENGTH + TVG_HEADER_VERSION_LENGTH); + buffer.count += (TVG_HEADER_SIGNATURE_LENGTH + TVG_HEADER_VERSION_LENGTH + TVG_HEADER_RESERVED_LENGTH); //3. View Size writeData(vsize, SIZE(vsize)); -- 2.7.4 From 9bb1e2b65d2d009bbbbfb223f2ed438dff1b10db Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Aug 2021 12:30:25 +0900 Subject: [PATCH 10/16] common picture: recover viewbox() api. though picture has size() api, we have a regression issue in tizen, we can't remove this api until we resolve any regression conditions. --- inc/thorvg.h | 9 +++++++++ src/bindings/capi/thorvg_capi.h | 8 ++++++++ src/bindings/capi/tvgCapi.cpp | 7 +++++++ src/lib/tvgLoadModule.h | 6 ++++++ src/lib/tvgPicture.cpp | 7 +++++++ src/lib/tvgPictureImpl.h | 10 ++++++++++ src/loaders/svg/tvgSvgLoader.h | 7 ------- 7 files changed, 47 insertions(+), 7 deletions(-) diff --git a/inc/thorvg.h b/inc/thorvg.h index 6c622c3..12316fa 100644 --- a/inc/thorvg.h +++ b/inc/thorvg.h @@ -1091,6 +1091,15 @@ public: Result load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept; /** + * @brief Gets the position and the size of the loaded SVG picture. + * + * @warning Please do not use it, this API is not official one. It could be modified in the next version. + * + * @BETA_API + */ + Result viewbox(float* x, float* y, float* w, float* h) const noexcept; + + /** * @brief Creates a new Picture object. * * @return A new Picture object. diff --git a/src/bindings/capi/thorvg_capi.h b/src/bindings/capi/thorvg_capi.h index d58249d..ea57c1a 100644 --- a/src/bindings/capi/thorvg_capi.h +++ b/src/bindings/capi/thorvg_capi.h @@ -1696,6 +1696,14 @@ TVG_EXPORT Tvg_Result tvg_picture_load_data(Tvg_Paint* paint, const char *data, TVG_EXPORT Tvg_Result tvg_picture_get_size(const Tvg_Paint* paint, float* w, float* h); +/*! +* \brief Gets the position and the size of the loaded picture. (BETA version) +* +* \warning Please do not use it, this API is not official one. It can be modified in the next version. +*/ +TVG_EXPORT Tvg_Result tvg_picture_get_viewbox(const Tvg_Paint* paint, float* x, float* y, float* w, float* h); + + /** \} */ // end defgroup ThorVGCapi_Picture diff --git a/src/bindings/capi/tvgCapi.cpp b/src/bindings/capi/tvgCapi.cpp index 19c52c7..ffbb9c3 100644 --- a/src/bindings/capi/tvgCapi.cpp +++ b/src/bindings/capi/tvgCapi.cpp @@ -476,6 +476,13 @@ TVG_EXPORT Tvg_Result tvg_picture_get_size(const Tvg_Paint* paint, float* w, flo return (Tvg_Result) reinterpret_cast(CCP(paint))->size(w, h); } + +TVG_EXPORT Tvg_Result tvg_picture_get_viewbox(const Tvg_Paint* paint, float* x, float* y, float* w, float* h) +{ + if (!paint) return TVG_RESULT_INVALID_ARGUMENT; + return (Tvg_Result) reinterpret_cast(CCP(paint))->viewbox(x, y, w, h); +} + /************************************************************************/ /* Gradient API */ /************************************************************************/ diff --git a/src/lib/tvgLoadModule.h b/src/lib/tvgLoadModule.h index 1025b73..70b95b7 100644 --- a/src/lib/tvgLoadModule.h +++ b/src/lib/tvgLoadModule.h @@ -30,7 +30,13 @@ namespace tvg class LoadModule { public: + //default view box, if any. + float vx = 0; + float vy = 0; + float vw = 0; + float vh = 0; float w = 0, h = 0; //default image size + bool preserveAspect = true; //keep aspect ratio by default. virtual ~LoadModule() {} diff --git a/src/lib/tvgPicture.cpp b/src/lib/tvgPicture.cpp index 26df9f0..790ac97 100644 --- a/src/lib/tvgPicture.cpp +++ b/src/lib/tvgPicture.cpp @@ -74,6 +74,13 @@ Result Picture::load(uint32_t* data, uint32_t w, uint32_t h, bool copy) noexcept } +Result Picture::viewbox(float* x, float* y, float* w, float* h) const noexcept +{ + if (pImpl->viewbox(x, y, w, h)) return Result::Success; + return Result::InsufficientCondition; +} + + Result Picture::size(float w, float h) noexcept { if (pImpl->size(w, h)) return Result::Success; diff --git a/src/lib/tvgPictureImpl.h b/src/lib/tvgPictureImpl.h index 4d329d3..8d4fd11 100644 --- a/src/lib/tvgPictureImpl.h +++ b/src/lib/tvgPictureImpl.h @@ -137,6 +137,16 @@ struct Picture::Impl return false; } + bool viewbox(float* x, float* y, float* w, float* h) const + { + if (!loader) return false; + if (x) *x = loader->vx; + if (y) *y = loader->vy; + if (w) *w = loader->vw; + if (h) *h = loader->vh; + return true; + } + bool size(uint32_t w, uint32_t h) { this->w = w; diff --git a/src/loaders/svg/tvgSvgLoader.h b/src/loaders/svg/tvgSvgLoader.h index 556a92c..01e90d4 100644 --- a/src/loaders/svg/tvgSvgLoader.h +++ b/src/loaders/svg/tvgSvgLoader.h @@ -35,14 +35,7 @@ public: SvgLoaderData loaderData; unique_ptr root; - //default view box, if any. - float vx = 0; - float vy = 0; - float vw = 0; - float vh = 0; - bool copy = false; - bool preserveAspect = true; //aspect ratio option SvgLoader(); ~SvgLoader(); -- 2.7.4 From 70d8aeca0611bb5d7533b68dc327dbdbaf4f5709 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Aug 2021 12:45:17 +0900 Subject: [PATCH 11/16] infra: tvg format is still fragile, we gonna release it under the beta. Change-Id: Id210f7c29857b78097d93f82eab21df5e1679a12 --- meson_options.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/meson_options.txt b/meson_options.txt index 2e3cee7..4de0cc8 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -6,14 +6,14 @@ option('engines', option('loaders', type: 'array', - choices: ['', 'svg', 'tvg', 'png', 'jpg'], - value: ['svg', 'tvg'], + choices: ['', 'svg', 'png', 'jpg', 'tvg_beta'], + value: ['svg', 'tvg_beta'], description: 'Enable File Loaders in thorvg') option('savers', type: 'array', - choices: ['', 'tvg'], - value: ['tvg'], + choices: ['', 'tvg_beta'], + value: ['tvg_beta'], description: 'Enable File Savers in thorvg') option('vectors', -- 2.7.4 From 2b0bce6cd14480ba19e8383c7d1ff752fbb86f06 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Aug 2021 12:56:11 +0900 Subject: [PATCH 12/16] infra: fix missing tvg -> tvg_beta tag. breakage was introduced by 6ad1b1bf732c108ec7e626b9005a76fbc4eb91df --- meson.build | 8 ++++---- src/loaders/meson.build | 2 +- src/savers/meson.build | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/meson.build b/meson.build index 4923b8d..e808552 100644 --- a/meson.build +++ b/meson.build @@ -24,7 +24,7 @@ if get_option('loaders').contains('svg') == true config_h.set10('THORVG_SVG_LOADER_SUPPORT', true) endif -if get_option('loaders').contains('tvg') == true +if get_option('loaders').contains('tvg_beta') == true config_h.set10('THORVG_TVG_LOADER_SUPPORT', true) endif @@ -36,7 +36,7 @@ if get_option('loaders').contains('jpg') == true config_h.set10('THORVG_JPG_LOADER_SUPPORT', true) endif -if get_option('savers').contains('tvg') == true +if get_option('savers').contains('tvg_beta') == true config_h.set10('THORVG_TVG_SAVER_SUPPORT', true) endif @@ -100,11 +100,11 @@ Summary: get_option('engines').contains('gl'), get_option('vectors').contains('avx'), get_option('vectors').contains('neon'), - get_option('loaders').contains('tvg'), + get_option('loaders').contains('tvg_beta'), get_option('loaders').contains('svg'), get_option('loaders').contains('png'), get_option('loaders').contains('jpg'), - get_option('savers').contains('tvg'), + get_option('savers').contains('tvg_beta'), get_option('bindings').contains('capi'), get_option('log'), get_option('tests'), diff --git a/src/loaders/meson.build b/src/loaders/meson.build index 24b6544..6a4433b 100644 --- a/src/loaders/meson.build +++ b/src/loaders/meson.build @@ -8,7 +8,7 @@ if get_option('loaders').contains('png') == true subdir('png') endif -if get_option('loaders').contains('tvg') == true +if get_option('loaders').contains('tvg_beta') == true subdir('tvg') endif diff --git a/src/savers/meson.build b/src/savers/meson.build index 2b35e38..0d8694c 100644 --- a/src/savers/meson.build +++ b/src/savers/meson.build @@ -1,6 +1,6 @@ subsaver_dep = [] -if get_option('savers').contains('tvg') == true +if get_option('savers').contains('tvg_beta') == true subdir('tvg') endif -- 2.7.4 From e3c57157bbb2fb471df94f1bd6590102ed92da46 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Aug 2021 13:51:25 +0900 Subject: [PATCH 13/16] infra: update build test tvg -> tvg_beta update it as acoording to the last change before v0.4 --- .github/workflows/actions.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 1460758..29fe266 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -23,7 +23,7 @@ jobs: - name: Build run: | - meson . build -Dlog=true -Dloaders="svg, tvg, png, jpg" -Dsavers="tvg" + meson . build -Dlog=true -Dloaders="svg, tvg_beta, png, jpg" -Dsavers="tvg_beta" cd build sudo ninja -C . install @@ -45,7 +45,7 @@ jobs: - name: Build run: | - meson . build -Dexamples=true -Dloaders="svg, tvg, png, jpg" -Dsavers="tvg" + meson . build -Dexamples=true -Dloaders="svg, tvg_beta, png, jpg" -Dsavers="tvg_beta" cd build sudo ninja -C . install @@ -66,7 +66,7 @@ jobs: - name: Install-ThorVG run: | - meson . build -Dloaders="svg, tvg, png, jpg" -Dsavers="tvg" -Dbindings="capi" + meson . build -Dloaders="svg, tvg_beta, png, jpg" -Dsavers="tvg_beta" -Dbindings="capi" cd build sudo ninja -C . install cd .. @@ -74,7 +74,7 @@ jobs: - name: Build run: | - meson . build -Dtests=true -Dloaders="svg, tvg, png, jpg" -Dsavers="tvg" -Dbindings="capi" --errorlogs + meson . build -Dtests=true -Dloaders="svg, tvg_beta, png, jpg" -Dsavers="tvg_beta" -Dbindings="capi" --errorlogs cd build sudo ninja -C . install test -- 2.7.4 From 3bb2666c95ad83bdef06d5cbc51882670a88f0e3 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Aug 2021 13:20:27 +0900 Subject: [PATCH 14/16] common initializer: fix out of buffer access by the version info string. String must be finished at termination charactor, previous logic missed that handling, now fixed. @Issue: https://github.com/Samsung/thorvg/issues/690 --- src/lib/tvgInitializer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/tvgInitializer.cpp b/src/lib/tvgInitializer.cpp index 0b63cf3..5dd5800 100644 --- a/src/lib/tvgInitializer.cpp +++ b/src/lib/tvgInitializer.cpp @@ -50,18 +50,21 @@ static bool _buildVersionInfo() x = strchr(p, '.'); if (!x) return false; strncpy(major, p, x - p); + major[x - p] = '\0'; p = x + 1; char minor[3]; x = strchr(p, '.'); if (!x) return false; strncpy(minor, p, x - p); + minor[x - p] = '\0'; p = x + 1; char micro[3]; x = SRC + strlen(THORVG_VERSION_STRING); if (!x) return false; strncpy(micro, p, x - p); + micro[x - p] = '\0'; char sum[7]; snprintf(sum, sizeof(sum), "%s%s%s", major, minor, micro); -- 2.7.4 From c7a13c9730d8b9b9f7d2d29afda343e859326e4f Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Aug 2021 15:21:32 +0900 Subject: [PATCH 15/16] infra: just released v0.4.0 Change-Id: Ib5942f0d2eb880daf0617aab3d5f133fcc8ef984 --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index e808552..f2bee6d 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project('thorvg', 'cpp', default_options : ['buildtype=debugoptimized', 'b_sanitize=none', 'werror=false', 'optimization=s'], - version : '0.3.99', + version : '0.4.99', license : 'MIT') config_h = configuration_data() -- 2.7.4 From 6e89343c27e58484d59e3a162545fa40f61d946e Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Aug 2021 15:37:19 +0900 Subject: [PATCH 16/16] bump up version v0.4.0 Change-Id: Ifadb8643cef023393f0b94d67739138baf69c493 --- packaging/thorvg.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/thorvg.spec b/packaging/thorvg.spec index 7ea3ad1..18f163b 100644 --- a/packaging/thorvg.spec +++ b/packaging/thorvg.spec @@ -1,6 +1,6 @@ Name: thorvg Summary: Thor Vector Graphics Library -Version: 0.3.3 +Version: 0.4.0 Release: 1 Group: Graphics System/Rendering Engine License: MIT -- 2.7.4