From 50b2cc2b2fdafefe4f0dd775ef93ea28694b1a3d Mon Sep 17 00:00:00 2001 From: Xiwen Cheng Date: Wed, 4 Mar 2026 22:41:41 +0100 Subject: [PATCH 1/7] upgrade to mendix 10.24.9 --- resources/app-mpr-v2/App.mpr | Bin 73728 -> 73728 bytes ...0e50513-3a40-4bd1-b2cf-3c1563722e9d.mxunit | Bin 57215 -> 57515 bytes ...6f03012-be22-47ba-81f5-0fc44294d7a0.mxunit | Bin 35734 -> 36034 bytes ...a3770fe-0cc5-417c-92fe-cf90587f1b38.mxunit | Bin 71862 -> 72462 bytes ...a91b0c1-3df9-4399-aca1-12f1adb5e963.mxunit | Bin 296 -> 296 bytes ...aee4fa4-51c1-47f3-b195-ba6151fbb73d.mxunit | Bin 155885 -> 157645 bytes ...ba6f231-adce-4443-8fd4-b431d22f647c.mxunit | Bin 11316 -> 11490 bytes ...e995f2a-a400-4ab0-bc1f-167731a10a61.mxunit | Bin 20306 -> 20683 bytes ...f32c00a-952c-4a44-81cf-505b9d436375.mxunit | Bin 102336 -> 103023 bytes ...5410ae4-f250-4aea-a636-62936e994a10.mxunit | Bin 20300 -> 20677 bytes ...b5d4ff9-647a-485f-abdc-7359ebbec551.mxunit | Bin 147849 -> 149049 bytes ...fcc2823-c303-5a27-b6c7-78b04c96c88f.mxunit | Bin 11584 -> 12187 bytes ...0a09e3c-3a8c-413e-93c9-60206eff3f01.mxunit | Bin 36905 -> 37205 bytes ...6ef1b19-2fb9-4278-9919-0e398f186933.mxunit | Bin 120122 -> 120500 bytes ...d9e3587-482e-4769-8deb-3ff53b764e85.mxunit | Bin 76192 -> 76492 bytes ...ee3cfb5-98d0-4398-bb0a-3592ce5f16ae.mxunit | Bin 91 -> 91 bytes ...f64baa2-b85c-4999-9a3c-3cc38382eb54.mxunit | Bin 189 -> 189 bytes ...07eef73-fda4-42f0-b68c-58dbfa9fc1b3.mxunit | Bin 73671 -> 73971 bytes ...23862f6-8095-469c-baf9-a0200128add3.mxunit | Bin 345004 -> 344883 bytes ...4bd5553-6fbf-4773-8497-2f46d522ac88.mxunit | Bin 189 -> 189 bytes ...9c990a0-36b5-4ea6-a3ef-37b615c601b2.mxunit | Bin 122462 -> 122840 bytes ...e70063d-53e1-477a-ab92-6b763330c293.mxunit | Bin 2561 -> 2672 bytes ...fb9fc5d-7c51-4ee5-aef1-a98088851edf.mxunit | Bin 99726 -> 100326 bytes ...2c9db65-0531-4243-ac03-519a85dd9b01.mxunit | Bin 189 -> 189 bytes ...6064c85-dd6c-4e4d-814d-a23b82347404.mxunit | Bin 223447 -> 224194 bytes ...6b0a1fa-758b-4f22-8a47-6cce47ca15f7.mxunit | Bin 264782 -> 265867 bytes ...7d2ecb5-6c2f-4ffa-a0b3-a37a40da3adf.mxunit | Bin 53749 -> 56048 bytes ...a55ffd3-b3b8-4472-83db-fa8e19bd6338.mxunit | Bin 34074 -> 34625 bytes ...d877940-5c86-4f48-bfce-5787e60765da.mxunit | Bin 67625 -> 67694 bytes ...21936b8-f6cd-4d71-b848-057cfef3b523.mxunit | Bin 85856 -> 86156 bytes ...7c57ef8-f92f-41ef-94f0-b66247ae1940.mxunit | Bin 39289 -> 39589 bytes ...959cb97-4144-490f-b1e8-b842cb549e3c.mxunit | Bin 7280 -> 7305 bytes ...ecbc452-2e68-4960-bc33-6101c4b7e664.mxunit | Bin 139500 -> 140400 bytes ...07be533-3777-4eef-aac8-5444e930622c.mxunit | Bin 189 -> 189 bytes ...18ffa1f-9f55-47b2-83d8-8ce903088969.mxunit | Bin 91 -> 91 bytes ...40ed2ec-6238-4622-8c62-3b4e8f39cb44.mxunit | Bin 92037 -> 93102 bytes ...4fbe7c0-6261-42bb-952a-ba0dd5e060d7.mxunit | Bin 44007 -> 44307 bytes ...550b3da-ccfd-4b2c-94f1-26a0ee0574a5.mxunit | Bin 35581 -> 35881 bytes ...85df806-095e-4020-b852-0d6b3b7d3ee8.mxunit | Bin 194 -> 194 bytes ...97729f2-7448-4c95-be09-5a2e10d53b0a.mxunit | Bin 34873 -> 35173 bytes ...c94af18-6bf7-41a0-9368-87502f51e84a.mxunit | Bin 38487 -> 38787 bytes ...dbd1fb0-1736-48b7-b687-e4ba95514873.mxunit | Bin 207539 -> 209773 bytes ...02f155d-b936-4a24-a3e8-a92c01d4de55.mxunit | Bin 41973 -> 42273 bytes ...2d3944d-781d-454f-b408-15318fdc23b8.mxunit | Bin 36076 -> 36376 bytes ...3528a06-83f9-45a3-8413-a1a245079dbf.mxunit | Bin 34691 -> 34991 bytes ...a349320-91c5-41f4-bc69-ff7644a67ada.mxunit | Bin 79622 -> 80222 bytes ...f36ec3f-bf7b-4e7d-9791-c29d663466a6.mxunit | Bin 171284 -> 172107 bytes ...1e94323-c85d-424e-b2c5-57a0bdeaa276.mxunit | Bin 65680 -> 65749 bytes ...602cbda-536d-4359-9ba5-1bec20752879.mxunit | Bin 19801 -> 20178 bytes ...6496df7-a00c-4336-853e-6640ac097b3c.mxunit | Bin 34846 -> 35146 bytes ...985993b-d286-4a00-811f-0faf257e9c45.mxunit | Bin 83576 -> 83876 bytes ...e2b120b-e11a-4989-b9c9-350483a6c0b7.mxunit | Bin 60929 -> 61229 bytes ...1bfc5c3-1e6f-4ed2-b1aa-7856483bfa48.mxunit | Bin 34847 -> 35147 bytes ...c7d8508-1a6d-4b11-8f77-a10f5ec22974.mxunit | Bin 118881 -> 119259 bytes ...ee78074-838f-404e-8a05-7fb1bb567043.mxunit | Bin 169562 -> 171692 bytes ...04b930f-8070-48e6-9ba0-f97a061adb5f.mxunit | Bin 86397 -> 86697 bytes ...427746c-b094-4717-a245-77a4cf36aaff.mxunit | Bin 74354 -> 74654 bytes ...48cbe23-57ee-477c-a76b-6489592fff08.mxunit | Bin 264518 -> 267713 bytes ...5811947-50ab-4731-95cd-a7b561b7366a.mxunit | Bin 264910 -> 268105 bytes ...a693f46-8dfa-4d03-a63d-c571fe430b64.mxunit | Bin 91 -> 91 bytes ...d582b70-5521-4242-aebd-48acb34c97d1.mxunit | Bin 67495 -> 68046 bytes ...dcf6ef4-e4c4-4194-a0dd-b1d97f0cdc66.mxunit | Bin 224299 -> 226292 bytes ...0f5873c-1902-499c-a3cf-91146ed71fc0.mxunit | Bin 53450 -> 53750 bytes ...36a5b77-2753-4daa-81a0-00589548079a.mxunit | Bin 161217 -> 160340 bytes ...bab5919-b396-45af-8486-3f8a3b049112.mxunit | Bin 124901 -> 125279 bytes ...d53106a-931b-45ff-8c09-c4a61e2d5dc0.mxunit | Bin 40535 -> 40835 bytes ...eaa96dd-bcb5-4985-9fde-6b65754360ef.mxunit | Bin 88118 -> 88418 bytes ...ec3d6d7-3fc5-42aa-a93c-30cadfd7fcff.mxunit | Bin 35468 -> 36019 bytes ...f0f9ac1-707b-4f12-a161-601aa16f5a4a.mxunit | Bin 52885 -> 53185 bytes ...0064893-3d06-4a11-8afd-7c3ad2b6e37f.mxunit | Bin 84210 -> 84510 bytes ...0eb8aaa-c979-42c4-9cb0-c0c7b4970765.mxunit | Bin 36251 -> 36551 bytes ...197f259-a90d-436d-88fa-a805ca29db36.mxunit | Bin 19795 -> 20172 bytes ...6a40cf5-f574-4775-87b6-f623dd60e4ff.mxunit | Bin 81674 -> 82776 bytes ...e494e4a-98c1-4e3d-915e-e998b6982e56.mxunit | Bin 178308 -> 179508 bytes 74 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/app-mpr-v2/App.mpr b/resources/app-mpr-v2/App.mpr index f8b3fbf09524e012fbc227a07f51bdc13c9baa1c..8db8d51a1f87bdac2a21245e8697371f5018a786 100644 GIT binary patch delta 11953 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 B&X)iH delta 11903 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 diff --git a/resources/app-mpr-v2/mprcontents/00/e5/00e50513-3a40-4bd1-b2cf-3c1563722e9d.mxunit b/resources/app-mpr-v2/mprcontents/00/e5/00e50513-3a40-4bd1-b2cf-3c1563722e9d.mxunit index 7c4637a6df852b0bf032afb1beb19d3e03f9e68c..07ea99fe162674cb8f2946fd3fef3a43074ad319 100644 GIT binary patch delta 1317 zcma)*ZAep59LCT89Jel6?hf<{g1XSiG(*!t>3o?RsgcuFTbW^L8j3baZDpmcS-v!p z;$I1-7-SR~l$;3sq9|mP_Vyu(s4yy|K4cLEMPN5^a6j$#_2GHW?>W!mER3?DaYlz` zhiP!A*gs8(m_#Tcge8;iX&xCG0pgY^rCR92+^`u@b5<$-?Bt13F^Ih#O4ZlFFNHU0 zMV(iv5-*RA(t!Bfqf{q6m>NAJx=$*__BtM6$OF;jQmTnAUcX9DsThZ6Vr;a34Sx|c zuca9jC*u#&$AHF!o#LmKk)f| zO@?OY1)fznLTNC=-}WgXLmqN5n;9qJ`)z@;-0XY}EQJ*D&pY%08TiMM7XT&O-vT6{ zVb@2nqPAGY`xLOt6}sF=bpG4e*Gp(CxeF#_d(^|>r6EF(KYBh%;+E1>kikdy2Ffn( zVc%y5Dl!}_dm?1{_h?C#@Lajd9&+jS3O!{(*jw=cHeq?CDlGlLW(o`Ftr~+&%&89K zmlu=)&Kf;9cvX!K1gpPXwn@T^wd&=%T;WvD@S5wH40G41!@3)FYy*kJzC&;1#IgGS zN$BAOUTJ&;cd+JgAphdlR`)0sH2!xoWJzdf8iX9Y-=rEHIAsH7BL;}12evCRrL>_E(Bp^(9(}e%9Ajv m?YfZbulg=u{$g!vRrx@>gTik9qcaS^g26sj><8cF?SBD2n``j^ delta 818 zcmZXSSxA&o6vw}FzcB=J<_bEJ>8Oq4E~d7)WVTo?+2~-yi1102^Ps*;KvvrtNCx&d>a9EROw(eu=&`@8|rCJX)50Nwsa`@V;v? z_;M_s9=)s?`KB37>(d*(<|j-A*qvykYD>qC)2Q9muS(rh8`Ih;z;M(g1+zzyiz;H@ zjY9`6kY6d7oTXO`q)1?|wN0a+nvD1Hu`Fu26&U1*hIeyKZo&*SmZr{IgRWuiay$bJHEuJRztSds|&K=6+30cg;2RvajyK@0qL&K)10TZAASY8LU0mTVxOcwB9L2;q3E fO{Bx^dg7YQJ9lo)P-5Wu?+}bWouW>=`f~pOW3v)K diff --git a/resources/app-mpr-v2/mprcontents/06/f0/06f03012-be22-47ba-81f5-0fc44294d7a0.mxunit b/resources/app-mpr-v2/mprcontents/06/f0/06f03012-be22-47ba-81f5-0fc44294d7a0.mxunit index 73a70cb33a717abefe35c9600c4f906cce64063d..c59e1016bff60f48da01ce50112815dacc0cf250 100644 GIT binary patch delta 1287 zcma)+TS!z<6o&U&XB;QTX3ohpGb~NJPE;mgQ7SWvw<#~_jCd)u(Q>jGN%Mx9BL%^9 zqgEvn*n^cXK4hDUN>c10D=B>uDW@O`Uxe}{ih?=~1?Oqbye|Il|My;dt$n>0$NLb+ z&ky4|zjlW5}Wk$K`7N?!I^uyctF!>p0MN^AocLaVId&ac$8wB zhu-LCM18li`0EtEAD#sw?^0H8b#c968gQzEzc)%69BJi?5fX?!ElO2m3oVPB5!W{> zi(_v7JyJGobt$WLE}p-_4yfHoccSx=Ht=uJ^IA+r`mn}DXA=xm9%mJIRhqsIc}s2H zx6`w=bAx>ZDU&pkSjlJCeqN1>88m9Xh=~>|u-J@~W~F~Camx!BqOOdb7{^IxgWF!+ z=&U|`ytavj%dPs?F^X@v%I%qt5cL8{*{>j#eA%kNf;9((WLC%_PXZZ zwjw}LpeOd%kWSuGRbas?AFjVlLP0~rWzS(ZwU?_x2P(1H64eME}1^%MRks3`*A{_<1UCpLt@-=v+l6~1A2R^gHQKhY*^@?%+Pq`z!TEc!Q z1jD3aM;cwsQrxltA&~C6r(n|-_QQR_8Py`1@hqV?AyU$NCGivOjb}WkW|J+=LoGw0 z?~|A&R0u7o4;Va^Y}D0>r|x%L?~Nw8T+O?VO0DfR6yJC@#MiL1(?aGjJ-@5pOk+JA z`yMAxD1w>9EWjYz9q!MjygzJ4tA+;Rn(%KdWoR;GcVZpy)6*l(3zy3xj&t(U?IrL~ z(v3aAl%LSdjPbpQpOGT9L*PYA+C-M0@D?DF#p&cAko5gFG6~`+PP)1u=B1c}P-Nsd~I(7Of*DbdR@`yqFVh-*$yRjRoXwF zR+a*y?c6$gXIub38mO`xTB=h47eyp7^+OO1n-W=6%{)R3^Qcn*_)|o^T^De!UHlK9 CWfR{3 diff --git a/resources/app-mpr-v2/mprcontents/0a/37/0a3770fe-0cc5-417c-92fe-cf90587f1b38.mxunit b/resources/app-mpr-v2/mprcontents/0a/37/0a3770fe-0cc5-417c-92fe-cf90587f1b38.mxunit index df92b29cf89568e3e3cbd5ec7a6fcb49a41f88ce..143291c0223d1c06898d9dae92f33513645f2fca 100644 GIT binary patch delta 2426 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 NPpDOIo}jga5daoWV{!lh delta 216 zcmaD9xg~-t2jhXTGWJkp#jG~j-l;CD={-b2i#PpA8 nvaRY>MzzVpYG9eo57a6d8T~g$X{a$Ws!wjzM5r&<%4Pxpzo3usm<<_n{Wr%kK4cW=^hFk}^4;vuyi$Sb zoX+H5$_Y%d+LL2cLIqg0k=1Z9Pd=z}l+kH&yQ+s&a!F=>URYvLW@1uKYB2*3&~T_7 zljV)4Y)(+~XJq_2d4u{fM#IVF8U)nO+#ITD$;8CZJb8llVGd8AOIcMsT_)FYi%l-n z(Z+9A_GT8{dPXK0=E<#kry2bw2kH~B45T5CadN()7~_o1ZHB>&jLws98R65kS>E^w zBa;yGWLDGDj4qQen&MLo_WnB`KSma2a|Zdzf6T8idQQG*K|l-0QMHUL77Q%RlbNjd z0iATv8lM)RlO8cLTQa0heroi6VNba za)O%AXfUTR0RVxL##{gZ delta 424 zcmYk0JxBs^7{>qadluz%LmWXvL4I^-=JjD6l?7>?dMXt`gGAKQ+7#3fO)XN;3qecJ zX3=7QTBGO#%4~>ea)}J5LZTLzx(hYe=Xu}X^UEB-<38Y2JdHYtLX0ud%aAc9DC{fB z=imiIQLjxw=W*e%4QE_bYM;lvObOeJn3QX8-jObB*I=hjyGD6+iM$bcC#dsVhX9bH ztn;R!Nnotb77CERQKEE*t9<6++p>!IiFD_>1UGHDHJ(@Bz|zZpkaC_3D3t0lvuB`J zMS?Y6Ql|SqS4~U-uz-{uJTnl< zp?`!`Wtyd|c-|~g(Vv11+8e3BIysG|5I>NH$L^t(tbs}+p9I5zMI?Rv!6;fLY6=a6 iZsy^MP`#8SKhqcediH1QeC}tPO}@K^A329#UQ^P^lm&QYr6;5?iB)TAG?r zz=36kSVqSj%7>q7p15iq%Ybz%l$@g|5Oo?!NQwR`o zlQ5;k(S;mN6XxsUis2Rp!>o(cqQDeN&u2L3H=X6k%tq7uMefW5k0|Y_1QFJ zET}R2rwG0$(jn*EyuC~I`+s!Hv3I(O#_C`zy07?7cy!?`A+!AO`%8Ps^0^q;5T}8; z!>=X{ZXq6QI0HZ8ibkd4g{sEoEE&b(8)GX3VRN%$vbLogRDtF>$UCeHChPkhy<0t z8TC4@L*Yh^RBzfZN~qvqvM2U)nFD4p|AY>&-xQ>Z%Wf%wgS(Q_c@qfFqQ1)r1{`_E zD$so=8o(cCceg-h#XY6;!NNE%Pv!tFy>F7r@pzz=KHR{rhp&m6#hbsjNW*;OHyapv z>Hb?Eui4B1wmzzp$Z!6zk=#bcvUvLORS3qf`m8Zxbu>f+=QW4%6izR=~XbIt`(HrkV z6xlZwGncuDhEdQq0+Wxb>3c4aI_NcYw+lq@4ik;NCB9vWHSrlfZ7Drz!)8O%rNhNZ zZqPBFJY7ito(JW`!$5ZgK%AyI$WpVI_60x_9HVFSV6ClUMIf9Z#DS%eL10wrhkgdS zYYgb9uK{fN8|ae|C}F*s7*QV#S^zzbUSw5R{#0bJ6lT)GP`D4lba|LflzD)hrC&wE z((Q}E1OYTY!glzxNKgY6H$*}#NV>)-tEjvmv9hDkmoacfHQ(H(tCOWR-HWxUO>*7l z>2)G3M|+n-1NhNX%dE*)iWPBSAgTeg?C~j*?6U+o2!V9Z$JTJ!z~!|oWj&cVu{IGj zgSY;~R&H=z#}F+`UnNPs4x~-VwxYxK{$c(gxIk(VJ*~yfsV~k1Z8UypXEUmus+QD)Q}1N;6($n6d_SkyH3bEERD~F z^ODH8JjHyoNDQcE4EKr) nXxoRN!9$-;6{i)$1Oka-*ajF4u#hHyt_Tl0yg2U**zWu<1}mP` delta 1956 zcmZ`(X;4#F6n^KvL@7%00*KbK2&jM*DV5Ekh$w^vB_cBc!~z)^VO#=|f>v8a2Rn*` zP`!ogHd@@qsX8vN_$uRC6ssbN6wuOwmZAvS-XvI_PWvmF?>px^_q_9+(|vG6 z#l8`!qVN<-w@3R7*kC`K^EUv)eZnAyVOSr=&44f4XK^Pp#b8M$uXb34IJXQjIxd5+ zcaj2nqUW0?B)TGH8TJpm%?+MqM0(}ZdHZlBa4Q4FXj&j|P)4wvgP$1v#)H46mV!Li zU5rNH=Ex@WdNO}z&N(TB@P_#j!1XzaLpq%JYcbiDC}RwsnOK0@ZE$^}mMgFk#|*OA zFR2a2;PJ^SoK?Av=X4TvX;bD+SZQ%s;RH4;34_griZ(28fImV+~Xllm_e1lW5C zhk6kXT~bde>!o7qM3+qB$Fw1=U0y*+JN^5lKhuTqf{aQ^x~zDYwBmJ!DOSichtJPZ z0%~2$H?AK&9^FjgTX#jUC{Kq+M~&yh_o^k}$`|gB1Eh7uod-0i)rAi{nCgH6S^WKZ zJ*q@lej$!alN_#Ev%)g0WZSV^eTuCo_Nl1By7&Oc0Xk*rM0FU$(LYRlQpdfo#;xW!wqE;}A~!*QI8 zgfw_UG{5&^8A6ExIN?eW%Jaj|u4v^x@60zAYp?zUyRp1d#b;H8KqJxgo$Q{Njcw13zeP#n&7A(KCdr zZdHRTF1~G+%5RDSaKLx()KaM25;JZQcL=ud>twN%3- zyy>9{739ky3fSq41Fmf~O6`73r7RKT;!*AOH2Z%0@I!v=d}Vyd$tSh6iFHrS0@PB} zHz&Fj)KTZVjE>syyO{A_B9r<|V+Ihu+}!|fnDm$hIh{m!5Djxc;^WKM@DHD_1Hd@B zSH)lIoyS@X(1kTl68D_9!#*!dX=cYuv#uryqCw)%yh7M#;1;;xk%OXw#7he@UiqdB z(9Ca(5Zvba3dD=jQBc|mbYu5!6{Ce)g&7E_6~ng}ttga8K`lWo-w0hFK)-~0yj~pK zxL){622$V-<%r?p9Ae4QdXekI=)!cNhXWOGoL&rrUQk(s0-;eJWT7o+&<=Ous4aAl zpjIb)J_4iH$tZh>;}$#j9~e9Krs|kdv!%4fTKPX_k2@Upaj{FE=7+TGsexYk#ANoi z!II2R)uEAR?1N9=+5Gy@f0*4?@#1Xtjzy7q?Pn{acINLinO)fB03D8~DwO1Y1_kJK z2(bwUt^81kxP=6=Dj2RoAqkxU!!r#Efl_4g$I$qQW-Qnd*(^8#6UfiA%yGsu6a=I@ z4CF9P_&W>~Kv{+Ieb$QgWn?5q1;2tD2~-c$^8r0aWWyY&2PYCUcbEtQxsYc8ezKz<^#=dn`aKgL&l3TE(7t3fjV#@gE3+aqlFZxoh381a24!{MXZS}5>On> zLeNUW7eKj%^V=3%+-Zw03E*kGyXM~L9hDJR4^Rl&&jA_B$0rU|pze(UdSl7{Wcqw( z@`X-Z+O$XvIkO0wDfeB`$farQRZ8Pa4qE)QL#^QmBAQ_@x0pvudhkmdn3F+npLKD1%4H+Oq=qV!GGU0;7q_^F8`_XP_nzzkMZb2My8_y8=2f01*-iS7z7L$m>3usm<<_n{5MB3K4cW=@I@A_^xf>myh4HL zoX+Gg$_Y%d+LOanLIqg0k=1Z9Pu{I^l+kH&qpF8ga!F=>URYvLW@1uKYB2*3&~T_7 zlLgGCOx82-*}P1RnUV451OPzT#IFDV delta 448 zcmYk1Pbh}2@4DVLcYkd&hXrQ~2~<2>)on_a(sp6}=T0XOb)m-Od*;>DiHzRsXmZ0h`11bSHzPMRV)K7P&|~cl=ZXG>Q%xU1D1)4@B=~tkWc^s diff --git a/resources/app-mpr-v2/mprcontents/1b/5d/1b5d4ff9-647a-485f-abdc-7359ebbec551.mxunit b/resources/app-mpr-v2/mprcontents/1b/5d/1b5d4ff9-647a-485f-abdc-7359ebbec551.mxunit index 34396642c2a50beeeea2cde0bb13eef00f025405..a7212a7661b5932863e979c4619820bedf5ebdb4 100644 GIT binary patch delta 5010 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 delta 20 bcmbOoe;|s3uUP2>ij diff --git a/resources/app-mpr-v2/mprcontents/20/a0/20a09e3c-3a8c-413e-93c9-60206eff3f01.mxunit b/resources/app-mpr-v2/mprcontents/20/a0/20a09e3c-3a8c-413e-93c9-60206eff3f01.mxunit index 0c215b450a3aa4b9cc0c4785d54243d2c451e4f2..72ba43a00a7b71d0fdea4506d0224024ce1118f1 100644 GIT binary patch delta 1262 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 Kx#SuKi~k2>W^Wb% diff --git a/resources/app-mpr-v2/mprcontents/2d/9e/2d9e3587-482e-4769-8deb-3ff53b764e85.mxunit b/resources/app-mpr-v2/mprcontents/2d/9e/2d9e3587-482e-4769-8deb-3ff53b764e85.mxunit index 029ecec7ee25c4d1b1d48dafd7785f1fcf802cec..6b1810551a8a6628c6ae2d33713ac0323ac230ee 100644 GIT binary patch delta 1126 zcma))Ur1AN6vyxR{qEYB-QBxZivq<5DVar$l8Ca{AF_N9dr(0JVo@n%K?zax5=ajb z37*!Ki15W_QkmW2K4l97vz85=!6<2K>^5goZ8(&)x;h_xy4Tmk_jA7Id(P<|XG0S# z2{{Hxyhlj2GmNmCAq>M%ClhU#vOSel=(x7Jdbw4qde{KOR*HeXYSO)3%Jt2zBNYT^ z23pAnK;N@^AvV@l_)_U@^kMdY^!L*utdi5q>9 zT0Z1j?Q#i&kr8-=Hztm5J=xZB{#;$tg_fohXHQ*Z)~nO442f~2OFHxE1tA3#i=ywL z0@G0~K#FHS0{;EXLyctlVg(f_o?HvS(Y;I=dcP*Yi;kEMkpQ-w;VIUA3!4tA%QTc6 z^J1}VM{lA`BTas|14#>rQdROes8;tBZ7U@SM4c`R?S40> zBUZ2XWX=kO7@V6__4nu3qUX(fn5%654xMl882|Gao?^#>7Q39hd2x^s1NE0e5ZwML z&;#Tl6I25&XLg7-3iIF;IaU|K=0&Hx*#H(|GSZc28GUCLJw^zCTTB~uJ1p7O064^r zX7~;+alx#K$gToN0O4418wW#BDW*A1{n9G%L711vETDcugS^EGn*coGt_`}JY_dU@ F{Xgc7atQzc delta 728 zcmYk3e@IhN6vy8=Z{{j}dsCbKVKax8W`8&}6QWijHD|Ld{6`Q8i6Yb_gD4>a!@p9o zgWjl+L1-qJ*n=dH=CqJh%3qtU6{txa$6D2 z*#)}(CR4moQ5a#YHDo@vR5qV!5ucNz=_qw}Gt#uiQ@SHkO!;#wyLic-QCBy*TNgF| zo=O~PqAS%p^>plIdVNY%{v)e5j;-inKbg9MS*soldb8{m5R;M4iSmX!9`o;QqEoOo zdGao~H{T^}Hz!L@X;zQDr)hAg3jdnu%5aXR!L)ORT>3ct396}j#4LG6EIj^3IyKe@ z2PkOVEPa?92R@lgmaG$6kXinuk4*pwWc&UT4pGIF5A*}IPwQ|M>C5y0M3HUAPc;Fu zTt>moVtL_HxqH%&*=&$gNpoiMjMPd;=B zkX&m65KWGCKMe_#?JnOfy?wRFr)f;$I8u4P$sIFZB^SD(g?x(L=mjFzhR?l*)dzr4 z3g4_mT)^5!=!95y4PdL*o`-M|K*L`1;Ds>Oq*Az?F(Lj!HWdh6>ey}f`+YiQSHsqD zzHAoo$GBj&xCiDTh7Imj(mg?N0no*>2m!j`Fq;&V!jJ}X5Kgqmg}^?5gY0CeQb-Ad GC%XTdx+FmW diff --git a/resources/app-mpr-v2/mprcontents/3e/e3/3ee3cfb5-98d0-4398-bb0a-3592ce5f16ae.mxunit b/resources/app-mpr-v2/mprcontents/3e/e3/3ee3cfb5-98d0-4398-bb0a-3592ce5f16ae.mxunit index 46ee7a4df642b0bea9d6017e1badaa68b72b5c5e..53a39237c416159f95d3bc84377243125a1425a3 100644 GIT binary patch delta 11 Pcma!!o)F5$%m4xa4|V~i delta 11 Pcma!!o)F5$!~g;S4{!mb diff --git a/resources/app-mpr-v2/mprcontents/3f/64/3f64baa2-b85c-4999-9a3c-3cc38382eb54.mxunit b/resources/app-mpr-v2/mprcontents/3f/64/3f64baa2-b85c-4999-9a3c-3cc38382eb54.mxunit index 2cd01e64361152241411ca465aea0964a4c67fd8..79016927365c456b76bf4a4c8c7d4961a777bcd0 100644 GIT binary patch delta 11 ScmdnXxR-H4C?oU4uyg0EiA6y7#DKeR4w#&yJY1wml)M5 z{lA6Aw^R-6pva$ymVf?t6ZtCeJyI7Kvj2XG&(&G&riqRl4YejWHu3|S~9_7lmG%;CBLoHZ_ jPI0CqfC|NE7MrLUZiYsGkp)`;r&2AaH2&){iY)&D=>B#y delta 678 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 diff --git a/resources/app-mpr-v2/mprcontents/44/bd/44bd5553-6fbf-4773-8497-2f46d522ac88.mxunit b/resources/app-mpr-v2/mprcontents/44/bd/44bd5553-6fbf-4773-8497-2f46d522ac88.mxunit index 76ad0943296b8b76947bf4ea235899be76fa4175..ed5786fd90cafb824baa9237cae5d227dceb6b31 100644 GIT binary patch delta 11 ScmdnXxR-H4C?oU4uygixv@7G-&FG8YL>@nAp~_O={BLvaD_=Gkf>1o%zlA&iT&k zyJx$O*>w6Kw(6y;f~8HvF42BW9b=L@A@2A zR*RhFR_(-^jv9vfbc)&amPX6!<^H~tA$ls7uTF}bHe!lKY?duw>twlZw7XW^Ro(ll zF~#mVD0lfEgcwn2X*;%3E)Lkt#M}dxubBr7F9mgq!^5J zgs~4>3=Uz5%)LdPAGTe~2CX&x_;LoTSR^k z8LEDtVJQ08(J*pyg7_#9l@#chT;_PExpGPHeHmLv!eEylBY!`2vxm_-W2wpd?$QKt zX72qt-)Gd$te*4k+=7R-<4x9W`;+9_^Z;j;8DY4yE|L8_K^~uD3gwt*0)LQ~AV&9m zaWk_cac*(jztb{)b)DD?mhJLed&6AXW3o)zn;>e^H>G}is64f9-(MpK`Be@yS+?!Z zon|C7{h`V7^uq+PY;56%C;svCi~o~%&3DE;ZTikJp-^}3vLHM+Jbn^g z=m&|8*dbh8&7YpliKL+?b~uMg)TYDK!HZX=ugILeC@X!@>u)XjgD{Xcw9l6Ql7m8J z%UUGDUNcS@z{Kpks9sQ9niT>Os4=Jj3TcAI7Js7;L3(*=$-?v=wkTn z8hsklZb@|A5o1*8>~g{kAcF3RIE^ei{JbgyJ;fB`C-Pc{NGfu{+ss`{_O7_d`CoTc zMHeddZb)MACY?JT!k>O}w*hl;5F!}fRGfxl7!XH69#%mLuk?4&h6y??EqIY97Dc{Z zRuQJ&{OW}S#^PV2>BDfGy+4lz4#yO=5_O+H@`?A5p6hj^YAs z_O*e-f)VIqxJi+t@fde0WQ@+ImBR2?d_*YjtwP#eM>(t{uzM+#L1+sw#_ z)r1N^Q+Ft8`D*PNuL>u*jaW{X6(!tp8RkUK%uktKgknDB^d zU&awc)AC4FsF}mcRIU|gTlk)b3l++?Xbc8Erpg#q2MJ0Q8Y-L3cS~-#jcKkCkY^e!99+HDr-e|2AqE_EP#P z{7v_F^AL9}mMG~R)sTAP!uE@DBO5NzF>}^kr4l{A2D`bQ9A2YJq4!fggt5UIDqn|7 zyq!5YRzb#gc7rhu9azuxE|!*Uuxf9rP0U6l0Xu2iCY<2Q^U9xWz>Lkq4Tkr~As?Nn zrrY^8U>e>-17mht%GrVo2%^LfZ2*n<2(b(XO5e&0&_Ge2*nlyqaLjg;8Kd3a&M$*N zsxMGQ7AZRn{44)#NOw0&^k4_R;?i5XQx*Oj>9r3G6H3gjzj0ck?jn4N%e3uNRbP6A zpE!<;xo9c*Gqmy6dw#A8DpVeSjuZ?2-e)9QTEY*zsU()F!u3j1DK>z)YAALOuUQni z?NtStlkWZI`R{=f*X|Wc#D0vn5PrvYiSo*=?u@eNkWu)9ge+xy1^kTK)%c~==zWM_ zAzSG=h(IG^=pj`^H*{~ATM~FtQr@V+03&q8VO1!n7b>(X#WGd{uaa}ERYdP@5x=EE z74JIuG2B;@>X8rK8)hZ(ye!c_k6N$Fkgw5?!GnHx4A&5~vq3$ir2&q>Np}xx!QuU;OeStwN8i& z<^N4Czt&u}LF0t)l;AdafTuLG-DVH7&f@^?Do@VC3;g);?64W>b&2=oo^tjQKO1$& T`|_tv#{YRPowgO=6TANb_nX3w delta 2795 zcmZWrX;f5a5`Fc(MqAmQEG4Hj6<}P;g;u1%?qjlc;FiP>0B1Tp~e~xQy!n zPplY8#2^Z`2-?DnfFbUnf)UZ^DByDDOroNo#u$xesyFRE^Q+IfwcV=kR`t8q(7U6) zH=EvZh~+sluXExy$8kb^6L3NR$2gAT1G$PO@xP9r2q6}rPm^|`lNGS%XSJEmmG&(9 zTXC@0RpIv<^T@6mZ6EJw5cX7?qlMMlRG%1LP#rc$!w+j~hPucE&x3lDH`LD1Xgh`- z0O5GKx$og}?Uw;-nZWNeN1yH$mBCkq{iWvM&Qh)OaH5dB#~dBEN4xO7V#eBAMBC5= zwxC5jEi_-otg^-K@N`!AnKm_|KL~9rII}TKj}X_5PGI-L#i$jo+V0VHy;vwOR!m4| zjZAclRtsIu1Bd@!T^F~dOw*@3VnT~}eC99W=;wCgwSU?PyMFe_Yg(l=+bqgwXTMTuZZA(<6XNfA z#hSC#m*1T8Y-mlq`}iU$<#BsY-k&VW_xoUOPwHjoxRUB8i`VQdt+XhgF)zn~&5jUz zK22af;o7JbSMTYezjWIy!&}mf#(_3`i6?Ou5=d6ix<1p z!Ut{VqjFD(6E(@R3P(@KcQ#S*ms$(70Pp@rN7ZE8Fh%kJwSzswXqQ z?5B+mPZK6=?YrrjZ{*kKO=LW@6!A8;-;*Xkw^dhF`H!M)=G_=*uXB5M8M)8`8Vti5Wahm$yz)kd0`Dmv4Qs6BsCE*qrW{| zrmP^4%j_9YD7_Rw#XyEJj?e@BFwDu6ROt+(7^tL${b4YGH~z~7VkM$`8|3$CN;;aN z=g$g!;tCq@#9i-@S>^^enOyz8(Ht3}z}Ft|4co59Zw5e&z7M26e9^`eY}k?%boGQ3 zd-oLc2`$2vo^Vut#8f2dGXkYrk&l`s(=B-rVARltf zJq5=kpFcwru!jsE`$9b^v2rL8bn=6HzI{3Pg0=ONbu9e zUjS@52ljjzw^{NF2Uma$jE*o2Jyu700pPSTu!0`x+8B6EKR-s2Ri^;m4j*j~ z1_!K@gM%zEkeeZSjDt{+dz;DyeyqSx##1?`M7RYct0LSL4Xx0KnK6b!Y0{WjaAS~; zQ{$lqs?kwJ^yzV@fpldeI01XW@ctw?N$*~nKqks`2iPNq&y(N`fenArwVSL1yBW$S zlkU9nhsg#{syTv7K^HZ}=iyDYNl~ruLmdNA+WH|Z)G6x4)HnWN+)NysO7B#Hf20yh z(oE$^%BN-#hPZmRAxEKgu~(|f)t`>Xko1ki~I3!#>_qtD-s2Bhtf zNqjoQ10e|?!!g)^Hj7LNdu2csgY_t7(tM_D1v}ib7)I%YG8ZJ(5^x0eABHoQLLG^~ zZJDVWt?WCDy<(_b0d3TaEX&l3ERdssN!g^OA!xJG6u@#I5#UoyUIi!Q)h2D{*DEk+ zHA$8>r%)+tXQn{ex( z;oRShy%#hqB(Dk*FnNqTX!4K+y~ia=xmDn!!}lM0i-&NBq{muV1`vu1s*Np3bYo`G zjh0S*3+sT+ma3K_s%n8}z~Pa4XeY)6#|Sg*Gcnff^G@kX1D!(l&96yXD8zW*XtPzL9vh*lT~P>$0tzp-RrA(j^;->cvY^4-RxflA%~ RRmP8oBUKAh=5?6c>wkNquy+6e diff --git a/resources/app-mpr-v2/mprcontents/4e/70/4e70063d-53e1-477a-ab92-6b763330c293.mxunit b/resources/app-mpr-v2/mprcontents/4e/70/4e70063d-53e1-477a-ab92-6b763330c293.mxunit index 243180475a18b83ef29323bd5a13d9a85d63e5f6..0014b248c4718c44a5ebfad803f7e02d60d90a25 100644 GIT binary patch delta 184 zcmZn^`5?krFp<%lNttV+-*3je$zF^BiX8q)#rZj@C8@4?iAg!Bp+z~adCB=HnR)39 z3=GW14DOTXGluiOV`N|uFkoN?i5W87-^|K%g;9_zq$n{NqL6{vgh7aD^F!u|j4DjQ z#W~KYMJ1VOnaPPIsg616`9+x}8MzD`K;6Nmc@d@tmXixv;~4KxzQ9^4<5*mrpPZRk bl9`_uT#{dun4ZeO22>aVa?NHNwxi4dQcO0f delta 81 zcmew$(kQ~nIFZqtX$$8>zu$~Olf4)NSQ(g&8SEzSW(?!M06f1G+W-In diff --git a/resources/app-mpr-v2/mprcontents/4f/b9/4fb9fc5d-7c51-4ee5-aef1-a98088851edf.mxunit b/resources/app-mpr-v2/mprcontents/4f/b9/4fb9fc5d-7c51-4ee5-aef1-a98088851edf.mxunit index 33e0a4a018b6855558ee3c026de09a0a3d71e438..d006774e3ab6e82fbd39ca0a12df5199556ed2b3 100644 GIT binary patch delta 2550 zcma)-e@v8h9LJx}_kp`(#NES|XCsZd+~h}*AcSfBIPL_5IK*}go!bp8iZJ|<8zfLt zYx!e$Oh2|y(V940twg|{@R0=~o|6m`Fw>P`YT%Cz+H_0Pt*-AKcXq4op6B1sp4a#N zJfF|!`+D5Fb=O;U?E3phSXDjqn6SFuDwUf+kQNI}5Ckz*NNmC0`Ua_UyAV>`zg@O8 zpeRK(hgKgn$&-zdAPqN$R{I+9e$xeM%eK&>d!zhob0J99y3lHRot*i09Am}=e6hvO zK3;?q-Z;6xsauC5luUbrHrL_SEM}oW?9$4skD`welNn?^apmgFOgll zr=DQ9t+@3|H(Qv85r-V+5ld)BeS{!HE?j9tc*l(I9qKT2h=D@qyJjryNRC^-wPs^o zdF7Ux%Bl@7zac!r`w(acrIy1!Ir?xfW6>g>?iz+H+}mBKO2m&Z2mGZcMqDDSl8=5B z3!M8_*36k88K--uz=r3JYJ@6A9*xKlOd|e$Yz&^q(OzvFWiJDxfr1@zy3MkwFCBQY ztzZ3w`NzwENg{3cjVsvSMT|ixqM6$QaMh`(8_a5r}ER ze0+6uf+P83T96k2nsCFp@1Pqqe^3Xc^T!#B6mjgr3CP1e7sC+>U*t)Er|_Gf?n5f} z{2cCK|JI{)K2;vLWMoV);^@RlLte0R3l5sG>vFix`O>a|m?@(M=ur z?M3VLP%K?({iwArrqkKB%@XaxjKQG3l&euN?eiCnCV)?1Rw4ss=d z>W5+UVY~8mGSvE%MGI1ZJBwyg)Im8^T1spx#DXC!Fmr0xfthmCKz$N{Q@FyYARV~F z=;;it;X#SfnoQspqok!8Nx#N`l#*po#^pu(mumn6_M+h|;QFGrYz<7Pzi2QQxWH(q zMIA)_sZ!-g9^3=)(ib-19;2ES>Kq@+|3s#=7J$kBm4%uP;J>0-f6+)0Z)-MvQml!a zH5hqHfGdm+*fl{uhtbd~;1Z*~W$FmmOo?)AHEi~&jFKI|T}IQ6uwYPTWUc^iGm_SX zef*)$aNyEB<=M4x2MqdvU}!v^FLwSq_>9NStP6Y2zgDBUPT*Q2uQMz#tEPb0D6tAW wP(U+P>I~LStyUg;2}JHRWnMMR0fRMo6YUB7g-c)2a1*<4xtQ|dYj8L2A2C|tQ~&?~ delta 1538 zcmZwGe^69a6bJA<_bD#a?mkMfVF)D5Txd{S5*!kSKwOF8hx{6CMuSmChBk9z0v3wV z`~k-B!=rnt9Lt)T1VZVB3quG}V?YRt#g8CF2#C;=Rk^&)R5FHlA*%1tT2AzaZvE<6-1#>aDIx1`B=CZ@H*rw4C4 zkU$Pk78pn?L9Q^F_v>yQaow~z`eH%qTj{SJ_#EME2i`B$;!Wzt!{0YA=vwcEUwWgj z#A{HKK!>v+kni?&a@2Pw=}j52v%S4;m9#7yp2iz@*I{M3nhzdxt}0D*4?Efu(dZSs zV~f42!aL<_gcHZd-AQ{W=A0`g4@1zgB2n{Mh za;q{3`IF#e^$)NLzdo-w`)`5{piTau;&cj~FjwOYtg=jyRWzVReeF0rhrSnWG48H& zAu|NC>MY=a`g&_T0ALgf8sdO;4t!&sELa-jfZQSI)zqnchCScX)!V``uFM5B%|6m> zQGRT2@W^5d=GB8&|*DIbHgA;2>b3Hz$gY?X#!8Yf5pDQ^KH%$C!!-@JL7~8^t|68mw>-+7VK-jA)((i}KkDh>c(^VM{&awl zNrKUR&G0O0`t?F){|JBvlLqEtImQlJ`&#J2E8r&JFEc=<2p+rM!kQz8#pYq)0u(AN z8~F`ZW6r2_6Z?OS0W!^D^VqlGjfcmj)HsnyV6$METmi5KCw{kn`jl{Eic^!@ML7Of zHlJA}f7-o8f?@tF;V&1;)2|8z_Xl}|*Bz6mZU&)ZK}CqS_EbGY6Z2ZLBY@*FhL&|BLS#V+^-3Koi;!HFZ>d=GGSyU;l=pM4x?5 z5!HX}NqPVDm+f|-65kI~FTeA%=eh8Y)8;;?Njh=TUbXTyKj8$oM8762h<<6Q7XAa6 z&T4@PrkA|IdQl=_Gb3Cp@}>KIf%&CD>%jJqi-65}ejo~_#T(=`MwoW_12ar(U$7T! zi0MKAFvYYhP%4Ow&6*$(9n+K-rTKQqv?3TDNv7RAxKL9F{EubY7zzwCJ@S(D1vAqe zL6oDmpMai!k{uo10-t~kPOo4+qk5QOoAhj3?2(XDk0`dcC!LO3 zEZCS+T?{bi)HzmGVbE#9c3{$}M?A|J^%#yZr#(r)oKsUW*rC&*9l)g1zMUXZH#6#L z!kAO_E?~}S_bzL*1f4#W0!+Fo)pk`j>2&KJVASbjdu>l>oY-!TPXmsDHz)4{Q9L!I QOCv<`g~UAl8r*gL2k}KPh5!Hn diff --git a/resources/app-mpr-v2/mprcontents/52/c9/52c9db65-0531-4243-ac03-519a85dd9b01.mxunit b/resources/app-mpr-v2/mprcontents/52/c9/52c9db65-0531-4243-ac03-519a85dd9b01.mxunit index 43765f960accfa6414ad1d0594a5e1170689b785..78170d1dbf88efc4aa2f16c0097e97004aa0a124 100644 GIT binary patch delta 11 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 NF~W46n^(3Mg`y&pv1cqPl}gIN!;HaDWXo$V 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 lGPDW%~Y$z(-)GF!0@+wetfMOkVqDf{}aXrXXq zTNV}dWRBQUS}(?y8SERr9-qRUS`o zdh@rLstZnEtJ2b)ISXp-!q>8N8@cLylL|}0_hD5V+K+$9%5g}47BQ(*SvfXiKRRs0 zL^n31SWJ=!>g43n%CfXcyyDJBXojBSU?xd}`M1C}@CcFli^I&c~ zpM-45poo$DH3rjp6eGxyoDVEADq1v#uVkbtW4|J?e_|}c`^ND%8dh=lwk(@l#_L5m z9>AC`h4Igrf?vYFQozDvNFOKhj~JJ#Bv)v5skzS(R>d6 EAFr~H^#A|> diff --git a/resources/app-mpr-v2/mprcontents/56/b0/56b0a1fa-758b-4f22-8a47-6cce47ca15f7.mxunit b/resources/app-mpr-v2/mprcontents/56/b0/56b0a1fa-758b-4f22-8a47-6cce47ca15f7.mxunit index 84402aa6b03d65abf68db8fb653b61566d7bb9ea..4f209887cc4c5b2d9741a8c1ea6590484f97dc68 100644 GIT binary patch delta 7928 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 delta 5752 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 diff --git a/resources/app-mpr-v2/mprcontents/57/d2/57d2ecb5-6c2f-4ffa-a0b3-a37a40da3adf.mxunit b/resources/app-mpr-v2/mprcontents/57/d2/57d2ecb5-6c2f-4ffa-a0b3-a37a40da3adf.mxunit index c6460f6e4b17736c96a55cbbbeca9572f3020ea4..fc5ebe89fd9d9e6242825094ec93a40258352d59 100644 GIT binary patch delta 2060 zcmb7_e^3-<7{_<_)Ir7+5H$M%FL_dgM<5CkGK4awB7-7|kZ|tZy&NmYF6`}bo>Lk$ z!w=ChSW3lFbhHMoM&v+6#QX)sI0dCCU|CL970Bdl%Z!h6I*i_I?B1bt(Ku@I%l0| zq3K!9n;$-)>1gNmQ#~{tv-i^uhKZQ%Jl}PhW+GypjotGYI>I@0ZYK?4YCfh(nA#pa zGgT8A8AXj}C~CBJVG`v-!8P;Tnunu`cIw-&ELqrlrT!y1my!F@b4myOqsvNm>*QeXxDCm$Bs~u!k`Orr8xnDm4O=B_LUz`Qpai6p5RNk8BP(K9 zVB$ny#KA&!T*RM?8lmWX8n;Z^AsX3nJXY(Q@SpnFK*B#-bhez)F@Ck!eH~ z5RIHZawe6og56&??H!F{^^&rEEivu&j-T9>_{yP7Fug#o-v5l;+cZ8wut`QZke;=O zm^C@{RxIfa4n44O%WzC3L(nG2;DG*zoU+4hm;83DGAJ^vSIKY$>Ukssx3Qst{dr<$ z`KXrzqQsM96d5vM2?1iCGIG z5pA55FBDjb9P1!>F~A4jAeR{%L>rfnMMwb`AfH7|Q6cyK<<(Oqqm!4twa@rlN%fQo zioYXTrV`N69>AW{dTd^y;yZe5l6K6U-0a4jtu;fPmp*NjE*>@bmNDnLcVGIYIj_12Q5Td#W6Y%0hR!Ua zocLc@3_FaIhyh6Vb3F1?^H*#V-v2#tQeInHY3HSdvxFaq*(ErMN{iX#xYo3dMFny%1A7vGkfmzI6; z?YN~a#eD=By;&|f{-jU)*`pQly9}??ojiOjVW=-jX+OjNf)aqko{+rc&y}H{U-NSeojUQLdR+WzMdX_e`8aXA@@`-OhTH$nKhR(061e!aT$l zR1A{}j8!QLNamvSOd=fE9g}y{Ud1m()Dy(pAn)!Gt!wPA+H; z2^;nr;Dp}_=^r?Zy9Ri*+JG`A#l9D}uWrH3n`xzwFWwL&6}_QY l&qm;dj2L2Mg1Mq%@+Xs!P-w;y{KPOXhc-<2a=DSB{s6ssoZtWe delta 712 zcmeycmHF#pW~Q$fCo=gnExx!hSa_3M9TNistBR)!g8%~%cv{;!$Ru3~pZYw^wKquW z*(-rd56iPBu z70UCAveR<%%R#Duy2?_EQow4`6BG0FfDSQYIEUhpb6%!jVVe^OsP~z&d)8#Ni9hQIU%nsF((tq$S*>*H8(RI=-iCN zvQ&lK{Ib*(g?x~$K)`HhV7NJTlO7YJ(dH>zG?^HUH}BgP$HZu|S$5|XCPvfEn|5zy zWHj5HvG*?{qxt5v{pT4KEEt4QBFFCB%CGyIxnh>glj7oeN)Sjjuhp8OCllX%m_Ik{-Y56T zid@$6mOv%WKx0cX^MGNSl$DxX0uJKJf>ecS!`jIehm_gTC=CSZ^N0Ov^OOaK4? diff --git a/resources/app-mpr-v2/mprcontents/5a/55/5a55ffd3-b3b8-4472-83db-fa8e19bd6338.mxunit b/resources/app-mpr-v2/mprcontents/5a/55/5a55ffd3-b3b8-4472-83db-fa8e19bd6338.mxunit index 68924b03c005f3a41bf4d9589cf872f075053572..e23e8f335cb903efee76ce710e76c9f9eac87477 100644 GIT binary patch delta 1135 zcmbQ$#dNTbiOI2jBU3gbQ*_JZd`4%1FU<@L0tO6B3=9m+h73=eCm&)g5-30sOl;ol z!oEam{2s6A!86lFa zGipzMVf&QPW%4;Y!saWUQH-5p{}V11$0bRKz9+L~9dDZagvjn3!0ZC!dKs!00r&Hy)o| z;P6UM_hV!>WzdC{6&Yx>d%Y1*8g9>B<` zHF-zIb4JI>3o;3+ugvmiWa4F+d@B1eqxUJqc-o&7iHvd29^)t?DpPJ PZ1RT!f`PWCFi#i&7XC6( delta 588 zcmX@u$26;piAkz;BU3gblS$L$d`4%1vyBW40tO6B3=9m+h79`}Cm&)g67WP3v})Y! z!ovU6!|bD(g)hrc;iS3yk`h{@PD6 z4&`5JkE|qWa*FXu#{S8ACLWWQI8EHFV!D%w=^fML`{t(^6(+B?@YuY>=?vp!eLG%e zV+P~RZ>$6vf#UzH;o|&^e3R|%o-(RWR<(x;hB=BcePWuN=XilpezLt2Nc0vXW7Xz* zmq13Kx{Iz5tB$(`GBSN;nk?mUj!|jyOAn}SDQ`ihXUvmzy^k}>O#bQ(QTy7*jfwHm zWF!CmjEa*#`9qZ|2MID-Y&H$z2N~-c3>7U46=(XwG`TAX;{uSyEbJNMuQvo!?)>j}^=CSMyd zbhUx3F|wM~pMt8$Ft^*C29^=I5r}snei4;IP6x1mq9z}5bYV|)U7o*2t6JLGp7dG% zWJb}WqgP_n0~O9L*hJE(AGw`?1Fs$?nt05~(kVOR=3c%VyRzD$0nORTKHJ{RG44pq z%+JZ(n!CL~aOV!r7>TyBqbx7yTS69649>MEqPV?onste2j923lL$DOvY#Byt=^wbz zsDzEo*SH8E3RmVy*889FprJxArsn?&i5OlW3(D(WB8CY{iraQtAreD($)b`?o?vF1 zO{u^uoq0==;dWqNj>rzY{X7sA#ol)=Dq?0W`7%X~sk>xZGGteZ5dsy_vZoE6Mcg}I zRhIkiS^^J{?f)L4vEV&Pz01VE@L;hA=-BaMB`6YSn|vcpjTa8cYLeUO77`*XqS*Jo zl~=9*Kt|PRx=MHqyABR<;PXTC0X5cAfI_@{xC5H-<1#5Zvz5I-6>fCq|D~pLv#}Q9 z@h(bX*fLVVdQLtEG)#CBmz7UJ2>O^M30v8Drm65GWC6v{6Ro_2{e&doDzP5m3H1MD z6yosVN=dzAsjgOT0ELG*^P0@9YTQs=4@qdRo)@*A(h+!xt*BiJkbseOQUKdm7o;IY zvDnc5A-NQdF&#S9?&$yan+K&k#oCTG{>WU5%@KmaL=p};Vi_P2Su4&NwLS-1rP-P0t&VC A-v9sr delta 1600 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 sFI<*7)_?)f%dRkzm;W7x7#&J^%m! diff --git a/resources/app-mpr-v2/mprcontents/67/c5/67c57ef8-f92f-41ef-94f0-b66247ae1940.mxunit b/resources/app-mpr-v2/mprcontents/67/c5/67c57ef8-f92f-41ef-94f0-b66247ae1940.mxunit index f2b2ff273a8f90808cd7b8c44b729ae18ca18cc7..5415ff66e0aa4de9617e1b0da5a743b5b85b9e46 100644 GIT binary patch delta 1163 zcma*lT}V@57zgn8dEQw=+s+Ye#lUK@Oe!KPiAc+jwWg-i(ah8+CyNfbnNyN#$!1nm zAi>iI)Ro3)L>J|Y7g|IgQ22o@!tA1?phaDjM0DX*9hMinI;Y#0|BpX^o_Br-W5bBC zn-B0)mi)AzF?kb1#uzVPL;d1cRy9Z8Wl<)@GH~>q_?9Dq9PLX_h5E>7c`N6iO@F-B zE`C^CAXf&{Uv~tBbGZ%CoKK3i25+quBi6Y^Sd4Vn7ND7xW?HklN_O79UTB+m=Xp3> zm^pTFYEG1_$_M)GmW8lSufU(>bg8@_?PX+jc%{kG^nz~cag4z|a_x3mTf3C@V0}wS zY4NrBJJ}L-)50_wP_7D_a|AJq(|gwh6jQuH3y1;b70{z932Mb;RW_(#cJKcH6W_|# z6S|Y&ps#Ly5%lL63Yo+y$CH2}N_zCk{5~_>5Jqnus2z>S2QZWth$Bf|L zO)Hz4ofmkFn8E2w`x7XmJI8fFq@xyK1HBH-Ljg^6>g6dfP#~te%!rFQB~Lt4OXA&n zNJKhnAafgA#~03#D6-Jp$#E#9(NnsZPP+k32KpR+4tpqmMh}p`L=sneoCu9#CbATu OoW4i(ka*E6EPny|Pg*Ge delta 706 zcmYk3TS(J!6vuz({IR^C|Np>NnN6MZN{Q3(LX>%FP14n3>*kfz(a5b#N2Qe5qK9Cv zI2c(JQAiOX=no$Z%&-T|M%Y985Q3Sr%Y(`EMX=~Uw_N!bh;V}h35bn%s_N&)k3@e;8w47+deAF(1xW@o6Sb5gi+T3YW4g;qOXQtClc z*+QvkE#Sz zn({Ix$pvd1e6mZc8!CT2*9s#xwMJGlDIzD8KTr0maI%=(CEfVDh!RT8Vqa0{&8Nv( z`VQPwS*E82%N<^Na2Rn3>Cd6}kVunyJzubRfDDFcA(!RysKW}7`Ob>}T!a{^HFzP7 z%8mq~!>B|blFK*+2~>M5NZqCwXy=biMv&cQb70-#aUS@}Ft4RG# zQ*u+M#ZPAe7>%8smBC}HAAANmTOEBpHwi@j%^TaO+M(s2Y%av_NR1cXKnkU_1n$^z z@hE^u&8=$?OP00(tacP3{zQ6sX-rn@FaJ{wAmp=Xde;68H018k^VNPo-tIIb?Bk1FTL4mN{d$1V}%ZrSa3;xQDSTltgWK$fFrC zQ?ZVEVnD$X710v!IM+v}h~pCwMJeKCD1!wPf--~;?A&vAnKgIrz5kxM-}AfoclLbd zx9z3I`w!F-aK1+XFB*`JAE!e)osP5U4j6EkMOi@E>nowYykdxy8Y_8bi8^?4Zk+celcsMuwd(S z;3vh~uf7v6lw`Xi#E-=1zYRgV-X!B*1$SZ0cek9-WP}YlEAa6`7o46mllR!wr+1#Q zAtG;+ep5!FbClq+JxfPA@$Lmgoo64uyS6GMZPF*%0q911%F(VKU z-)_d|ei`MyBr$en{QSjV#4e6m{^@GnVEXOW_LI_j*p9bV>dEe@5G<6Rjzee=hkedo zg~`}ZI$a?u(&#n7p%1?eBbhUmca^>*d`YKxQSc7^!T+wXe-qm^Fx~2viIdNN4#1&F-Q}Y!#f)CzN3a}=S z{1q@;sJfegj0W2=MIScf=+?d9kM;LdHxL>-LV%m78;!^O-D|Yi_6RF6fD;qkrR1O1p8;|X5g(-MwmwMoSS12H7J)ZKg%s9>Vrk=;m z*t=WxO@+qpa0Cm53IDnQ1mNIa)pDZWS5Sb2vL}f=nzl*waRz_j(bxSqo`U;eqxg*r zR0HqvoO&)qMomm+?6WjI7igFv-S zl6fLE@0jEr37-KJJmM9s7_?p}D&9aUp7kV&#S_dVW)?i88$`_3wgKgjB!>d^k1P(; z60reDw#)@8Ac^`=HPrw>#Efv5L*XOU^A(?Gx56eLdG--d`bgyh#f)s9k<-f{k%ZB- z53Y-#7<|a-MT${Y4kz6V6q2jCfLhz80b+4YHHPCfvuhhkX_nAo>1(GbEigFBbf z_W6?QOSMF-4w9Z_Kp`ZzVzq^+gyeA?PzuR~<%$v32a#I%D?$d2M6ZIg;7>dg)IJ(P3lzs8UP*-m^xP^LdQFw;ZR#KNM5ii)L)7@`2cJP{@ErY*x9ZjWJQn+>tG6Y zbZE)g6m;ui3O?x47LpWvr5mmok63?XJI{a_d)-qVdDv_y4(x#hhGJ?jL(%t=P-L^9xUmn|Ft{THNig~WQXL~~FvfC7f^m*sL&OGSvJ;YE^c$d_ iVK9DfL=49GfyfPv0oFePq@Y||U**A2eCmQaT>k@Nwy~N3 delta 2627 zcmZwIdsIzX90&0G+qasVbe#<4QIbN#EK9-|!-|lrtA}+l-pm?SEv77nW+YdG#2N{E z>K8@jwPqM%jQbfl)^ zUXtlWvIx!g8X^P|q7iy(h(@E)259^Ut@oNI>;iRh6Nqsg9D&T%h>N^OPb6)&(USO5 z;o=rhb>?po4=fA;A#Ss}8nsz$u_(b&c#x&8Ue6LUmrT|Q3)ah3t+IEIWKp+#APBWd z8r8bDlf*H}jSj-yM0NE_qBv!hBM93TtE=gY>Gvt6La13?oER&PUu^(Eh*4J|M%5r8}L&6ak+FI zw7oTYdg$am=t^_{l56Jy+nKd@S(9+ z4ea>~Chfz_KyM&@|;kYvSQxyPnq0u6STcF8tPqM#%piO zeVWQLHdLWMoeN|fso#~M}gEapR=v?`Om6r(+-KkIgS@5GZ z^-3e_W`+nLPqZ}f#c}9H8(tW2Ya-kggBr9%H_+O6l)2MsjW3}K9sf#c6eC`@`joU^ z$!6#w7=+Sf^{t;uW~>F2fbjGK8Wl-wgB!g0*aq9~4t8+hArJUi2g_{(c6hMHwjle! z=AIw{VH`-EgagBTLD7MyeZeRsgzuSA67D@bF>vgdhdH^%COq;VSH-!zo(tJq;BSs7 zU$8*taczn@D%$84yu&+T&*}ba#;JJhzn<0C|o7goW)H36d5p3{#2< z7t}@q_ks^2mFjyi*vrJJY{*!U%wXEre8h?dZ;c1826s)cO;@wQr;~uY z!2^@|xg|J^!wDf!f&Wf}e4UT=_-lIdze{D`J34LQ|~e6ev+*oKlL!2%YCb0d&T*b9swR54z0<&IeuM zR83(l{0EQ$VekSdwBf_@0sI3x#q$r4Iq^S$kqJ-*e%O1F^~$-!H>1_^w#jgi&&@`K@L)dlkH| z=$hBNN&CEIMm|R!mOuQ?DLkeBxXB6UGmI)m?!P}DwI^m;#JUq%tpn0>%T$cg@+^$Z z7ZpbOB0G%c7RihT6!Tx1KVc1GeN`o6 z(mt@hNGXMw;UP#dgoCPq=TLeL?`@JpEV5QXWU8|*Y(=#3sf;MLUTL!++WTBal=?!c zmVs`ngOU%Jca(o>T?6dmpfY5FA_v}IN>TS;pv1C4#W~q+*7&}kvy3{vCg)6I_XR#Pb-`85h<70B^RO!CX77K Wx2|_3JesgtZ)sP2{nV1wx&04}Qh*}> diff --git a/resources/app-mpr-v2/mprcontents/70/7b/707be533-3777-4eef-aac8-5444e930622c.mxunit b/resources/app-mpr-v2/mprcontents/70/7b/707be533-3777-4eef-aac8-5444e930622c.mxunit index 1f3cf9e0749d6f183d581b6d3109a9b7ae5c8704..f7bf9448bd02e2e4dddb45842c5d6a8edcf9b72f 100644 GIT binary patch delta 11 ScmdnXxR-H4C?oU4uyg;6-i?`myGKw%&o#pwQw#pFo!phbzXmN}Js7de`u<3DZOaA2cp-Zaf; z_5f(-l6H<~enn)@$uw;`qbNqdm@yQTV_+%~Krms%P^jgCy zPbP}T3ahY$Y71prYB;r8+g-$gavJ(W9U7_EIjLTxs;_161Z^wvqQ8qDp@bUGSL08* zbfGO!TX(S^!wSkRtr8QFaY?H0Tb?Z*mIXCbNuZ}cUdOxiYnhDD`j+=%I7eYW-NX&@ zu8?Z&6`wF9QT^3Y(pH#j$tKjt-FG3vfq$to#APsHjs|obVC{y+)V7+rOUJJ6DK2|d~RJu z6+OBo3!~X9Qb1cv+_nAnRxmG>zQ2795ybDbNqu3$3Z897SJkHY(}_Q7cnRP^2kwrL zRMF+rClZx(@GOJ3|aJd;ahFd73QPu`MCk`h-*(bYm5ut}MBv|QYr0w_5B8Czl z$R6#wNP$f=Rgt^q?hq8zN&)24yRQl-A8AQ|A$1-1jIuN_`QAvn_ zAtY4Eq-9U;AdixsN}(ttYP7ZgE?^j+bqBX#=cRy*5b3$Lb0M(~d?ktr%&BTU&4CerJ$40K1Q7c?_xJfbY%u08-V*z7sD)+PC ztgH6?p#`$yJ6o3@i8vT-K}t83_w>YNMDW|5Qnwdc<{VRlEm#TU9#-7NX#UtLMV*Ee z*kshN^+YT~0Qd94UkKv8Uy@?ZR-e`TdBdF{RS)h1E1L70(YJm1nQfuUu-5KHC0co= z4=Q;|96b0MUulTe#Y)qc`oR~Bshs?A8sU6Kfb`AJt3(+M2EKRz-0?Dhe*mfkn>4V4 ztl2P3>7nwB!MGyugdrWp)i5POU-KHoZzTU9P>zdgS2Jc%c}@rlh2316T>tEJxH4T9 z2D2eZ5p%fZbzBtqtf3vm-JMnbFw9lusNo%i&4v&~;BSp^;e$qY7`G|jDxVgPislgu zjgZbq%L+{gV)ghabb?rdl+o=l)n|`Ef0$OaPUZS^tDZYnOtuK{-MDrH;39yBetrUa z!?d(D%ASSR{E0A$lg2y8wj+pco{U$4b^7orV!DycQ{&pCo`@r3)b~t>H*k*^#LEFB z;4_tVSNZ2NQG#gx#w@A+*;Ste=5FAdlTl&{Z~b4X&9?HDDUkh-Is2gpry{}pA9b0W A$p8QV delta 1765 zcmY*YXHZmE7=7pN5^L*6d|Y(bYdA(m`pT@Iy#my z-{3VrVkc3efO&(@!l;NCD@~(2>QbWEFkrzF8@XFRe1G1|IrrRizVp3TaMfXDr2|_z z?*K~zTc1vo5$k45hvXI}F-ej%;Zo0Z`W=hicBXX(DNPy3YMt4iQxzxI1D@>cD5XU2 ztzipt=!PMYz5G@QHkO4lFD*TqvVi4jD0OOz+tJYro9~VY9k;7@d{F*?7nMqnG!48> zkR%8HggD7f_(}T7k)A0V;uG?QHRKlGUw@Fo`$xIW&5PPI_F6@3{%Moqscwy?s+jTK zhWB)aodx=)HwAHpx!=_I)%0m2pT7Nq?}-b=AR5~snd0@%D0RT>%zf1wd3(==rc+OY zeRy>i#tfR2k)4sg)Mrk1wwQgewD3Ji^RArD+jegpxB8Up?ePh1PpH8wl%J5HbIQnA zY|&&aq14zwr6pxcJo7t7Yqo7-Yf7l^_9@-NORP!kmCmH)+e@*9Vs^;fQ-@7T)XtL( zU(>7I=dh1X=h@Mc->xudiT2hYjOOOc%K7{zKtt-j3PjMV{j$=uzZr0$YlXLApwc3% z&aB90acZbEgSseJ%vrqpejpFr9L$Wu?B_iy@z$UAl>Kx^`JsMU~T`Y`HQ37)7O5FJb|0G|5V< zX&{3ud0)TdXb=mqCRh=nBflF#mi8@uX(7^2s6B(#q^pyaoVr*B(D8;#j=|mRija*u zD*DH!AlW>S-rnp6XL7zZwY%cfdAYyPm$$Cs1j&uoMAM)+-0=f@!zl2s33}4pv*UE) z{z^E~*rqxJknzDgbSaH^>_J)07ukP|hPPA-+UcQ{z5qe>WUX47^tc?s)a!}N<9cDU z;@O(4aeUT3UBgE@`ssO*&<%O5s23`|YiCt@ccEe}j92zRIRbdDyPZ{M#o|*qM1)DLjMsUh z5_(?f1?z0JfIENE6HPGix(@{=3Ta?);>Nycg$M7`&wdHlM<85{@rL+7$EZm@&_Q_2 z^L@`l8xbk>=0$#Z0Uy5C-)1olVpnPE86)&yjf_7CKq-8A!2m%=2IIQrZ&a=;$vuI{O4%=ElQXl)1E^V zoeYGi2jb8LqS3=23zb;>5vZnk1OPJ*CLjWihW39sBvVJe6+yN$T%2)L=Zr@$AX&|s z00R)jcO-V)aUuzWfH`XOL{TN*;}2KvJqaW24q;O;2CPM^E}DwIKo#GR(xKcx9W`K2 p8DB9I7hvRxpV=cTQLhu>FeFTRsNsB;;C%V#v)jj+k&4OA{{w21R0aS5 diff --git a/resources/app-mpr-v2/mprcontents/74/fb/74fbe7c0-6261-42bb-952a-ba0dd5e060d7.mxunit b/resources/app-mpr-v2/mprcontents/74/fb/74fbe7c0-6261-42bb-952a-ba0dd5e060d7.mxunit index 35d8735cbfaf692c30a86b64255a800ba98e5db6..1e6c08b13e687a6f461e2fea7e62c7649aed1f97 100644 GIT binary patch delta 1264 zcma)*T}V@57{}k|J)0gdch1O85EKcDxk>E9QHk?w%M3zYun88KE%Sq%I!$eAZE0o< zC-qns8gVmh^7=^T7^@X%#TL2VX$I? zzr_)vPT6b6@D2&RhxMD>Ewv3ESEaYM^2qV3X0lFx_kRk|P&0^mUKKM{j!~Mx;Scw7 z-YUyk?QhSL@b%GHeP*cn2%MReviHZd09KrsC%IAEvzCSyI&q-)8Qj70bFuQPzRi6P zDX)%vE72jL5WEQmcrU0}4Ph~G7LtL}{Y$(t@(6HBxEPA1Vug$5J|p`wprJIL!-Wfv zW#ZVyH4sYybT~6O3;8&HNil!patY8x70wSm;rB!azB(ZPQdg7)vd~p0g>v?Fcmse9 Nmq!#~Z>}Y2{sQ6yXf6N% delta 762 zcmZY7Ur5tY6bJC%In%V3+ZFuNgJ_DH%|A?sxgcAS$traYkx*$GqioJ)V`|Qo&K4E< z-$PmAEW#lqJ;as%;DeFa9}Dv#5(-}oHG)d4C?CXrx)Fk{88p8=IS!KV<5pBgxBD<~jg!nZQo)q5BJud0M{TDmj|M5C9zgPOY1`P`Lu#7{`p)+fOU z;x+}wAIhOIeFW*+k~bbNsl5B?*1JF%AkEy6IJSUoi$}OMD$`$|8ule?uZ|9`M%J2Et^20PX7w Aj{pDw diff --git a/resources/app-mpr-v2/mprcontents/75/50/7550b3da-ccfd-4b2c-94f1-26a0ee0574a5.mxunit b/resources/app-mpr-v2/mprcontents/75/50/7550b3da-ccfd-4b2c-94f1-26a0ee0574a5.mxunit index 074a869da6b8f7785bff4d96be5ad5f851e7de55..ff2b6f371bc14209aa95aa734abc4617bde19f33 100644 GIT binary patch delta 1238 zcma*mT}YE*6bJCeYF1{F#41or@|}`-QCwot#(OF?zR@OJj<4c-kzPJfl+azd>S!}QcD!67S}g%GR=Bmg1$GIcKEyK?yIZ3xYB^ z4Z^4_3$!cs6x0W?CSsY16$lAIbTRS6unU!V>mBck1${gG_?`cA&Uw1e;hY_D?&Mvx z0KT@-VMr6pZH$SV7&68LH7l@@11iOd7Ek!5g{Pwzh}WAv>G@{L6GlZ-lP64V;z^4# zK%8#$q?3)@?$rmPs=<>Qti05F9?%j^rM?FIwVprpbuLD&KwY90pCSb-bH$#L#Mz=W zdv@o~;`^bYHzG+LHAITgXj%yO51WyO_EK$2XQEWFkg*ls@hxpS`>EsQxb$KmIcv1y z<=L1e+7l6mE^|-F&6nB3)KR;N&aB=TrvIn6?n8IZmDY}|3-xu&&emTtx-~!E5Ks}0 zgDEtnK8@w)iGTmk;noAAjeO8NrVGSm?eM2^H5xoJwq=S8V?dH~q0Q7{4Pa%p;Qf&MeaaZ|Qb9HC5I7tx_SVV;Q5hyWUC$rjtVMW!FHZo H^(y2y%6-mdX;c*A zF%%+vtOtYQ7eNuJ`A}BsBJiaY(UzF`&|5u--Bu5K`uTeJe9!0nc|L%_LB!@8PjElr zhM%&)E&Kd}AS(h2f*_g%m!CZZhYnZznLct4;CLT1McoBVzsBB1YeD|y3#Zq7v=B2d zk9xz4170>2TMV+bH@teJmnG^y0y=uw56Pgx@=mt3!vM0;6He(olxm!pU$lo8C)`XI zuQu#E4)c*VQd~F#RF_&UKND`|em*;7f2qV}W^K;S zQM;5gm@`aLavl4&H@F*rT4<)=4yKu@-fWjX6oebPY0^9mV|2?>lGN1cyzH)O>~J=o zyVUFvV%2N?KN<^I%0!G2DaHC8@@d`5g_V*;fO00CFn|j0DcuJC0^(sIn~KVUP)OM} zF5PAe0!kuPmj@#A)OTvrju%quzIZCC$mY$jl*|F;RqA1wl~z`OD!PA)C!&C5g!S6X z0A-P;t7hRCja2gjEMyp~F`%fS@tQY~Oa5A3Ks5}phSS9eTlAoQ9F9`U86MA;9G`&t z8sfmtZZ}Aw6&ksLHronlO(wx0(z~XBD!Aw1@=J~-fMl9Hzo4?CE!(h*5PeASY5u)n z@L)VGJ0HPg8o0>Ig_d@*#QSZUqM3oymEhEU6r S`iuY;Qu=vtsC(3PCE^c9I96W( delta 892 zcmY+CTS(Jk7{>qaJEyDM_Fw5rQgbo2S;L7P6f0echtzo}4b99{Qao-Rb52V_GcdJY zrK>KCg?3Za7lc7I70N7P7I;w!si>tLG`p#Ynoe=uKELPvp7-!gUB$i*#L$+z=m*%} zOaV~JCpB{%ui=p6I6)AnZDzfY=Zp`|F^Nb4NDVA#T^HbQ6B}AD1pZ~6qx(@Ejcpj^ zD~yg}o{Wge0dz>pgDSt@fvWd-}YNe28UgQM%MfqdLY`8K_y*jd7y z<+caoiXGMc#Vm7k8X&0X{uUj!?O;wGGtL+ypfB4>Xj(0y0-rd(+z?!QZ#Xml@<#vS zOGkTi$ROQAmY{1S^-@t}peLU-r{U`>Gvd1}Oy&?vYKmeQ)T@ z)txjV^P+H#m?i=>{I06Sn0FU6(dJg;q?1c)-U z3foUwo?N4rlOfB_mnUh;mQjsb!pzyY6x(y!9&kM;1@H&bLar4QG?3>IyLd(h90~Ks zY+y3q0k{>);1u~44g=9b;S%U#b43pkKO*&%TELeI%Ix+meG-6_?ihZ88{H~jw$faY znprC(h_gr^ss=>9t35Y_%E?k~?>S4a1HnE{OtWWaM9Ni1f0&%U)!H3H#zeq*0eP4P dA%MnA_QW^!sR##{>byIEAB8u@Fmq$S%Rg0IFB|{> diff --git a/resources/app-mpr-v2/mprcontents/7c/94/7c94af18-6bf7-41a0-9368-87502f51e84a.mxunit b/resources/app-mpr-v2/mprcontents/7c/94/7c94af18-6bf7-41a0-9368-87502f51e84a.mxunit index 170271a658b25f27aad7854c9382c13f6175e8b2..81bf2b67aa3296a60a6b6b8fd434dc9c933d6bf4 100644 GIT binary patch delta 1147 zcma*lT}YEr7zgn4oU_%UZST8cE0jXT$kqo96OuMR=bEK9lev}|bF1ZIAKI*CD?hd% z=%NdsNH2^a$h;6L4ncGgqoBwn?Z!b^H!>lDq|0uqS2Nhv`+EEE|DALG4<|cC(@!W( zk3OTlMo~x+A|51^5W*~kq2JzES{`B<_j+y4gD}(vNTQNSc%?YA4nm^qi<@4JO zl!|5et)PY8-_0uvmp4!wMRQ36Jw01+5;c|zLG8O*r zcn6jE_KX~owtAO8=yXucAL+ZOOB?N&IbcHOdk9rH;gh5P_WROr05_lU3#)Ac3SbGS zf#Ig$oOJrQYt z&4j(zrlA(CNjb`glZ!xgDh%Fu14q$3AQxWQ1TNJGe9NGN!fEauHUiXRETx3FGc9cW E3-rZ63jhEB delta 694 zcmYk(TS${(7zgn8dA^nxq5D2fjS^jBmhL9EN!f*raK`3g9>$ubWhmMK=kgSGaIQ9@ zlZ|+2*o8=u8B|EU-AN=Br4}X>ix`R+O)IeIKy(rGt#84u-j^T$=Y9Y1_{Z?=9Yj~? z9(JUQ?|qDk1q>Nuf`Ps9aeulB#F73)4fWGtMp!KKCSrX%_hwo_6y1pmZXRAIA+E`% zkL&F?n8&wo__7*{1k!8WIEi#s>k_ZK+0aZdQdNxsjHj{sIMq71>s~uS#dLFj2lRk0;U`eQ?7v z(rOAw#lAUeG**jDn3#zVluIDna7D}_04cO!{{WlmSyc>P0{yDVz;8(E+F8hUKWYbI8%w7A6HA~Y>7>F*eN}*81*-Et0X=2)E1K$a UA{6t3r_%v8k=L(icR-!?7toXFAOHXW diff --git a/resources/app-mpr-v2/mprcontents/7d/bd/7dbd1fb0-1736-48b7-b687-e4ba95514873.mxunit b/resources/app-mpr-v2/mprcontents/7d/bd/7dbd1fb0-1736-48b7-b687-e4ba95514873.mxunit index 37dc09ada52dd98db0819dfcd0275fc229c54118..18d540a03e63a0fbcde4ade1595eab21cde86698 100644 GIT binary patch delta 7847 zcmb7}dt6mj7RS$8=VDhexxTK6;`l1xju%iNlR(WEA)u0sra)#%fFhEZrlVOBrJ-zW zIpu>i4SXgi*^y$H@lq7unvRTEK6+Sa(-`U4taIh+ZT>ii{^IjF?C)M{uf6tfuf48z zs_FGBO)<%D7vA;8Pud78-Vk z?YDX1sxa|R@6)!>r@@UpxKB&%GaPJ-ixju7DMi}Bz9UrZ{+ZU&_bg(V)UNw)cnot_ zh?SFKt-hIx;?Z@~FcCY+F1(%%w4Zy&o!$~v|L+?E>{{xxLjgyQ7lo5Ycu!4@pE={1 zxRm&~=MtyQR+_T&^=lBj&S#6{=`YioS=bbtj1{e7qHOt*_y5mp1dDhjrT|8Yez7A> zW_tG|TC|7bA`u=HF;i<`hzNP!jM0*(hk@#+Bx^6d&>I+`7aM?t0~Ctl_*y6vyIwLH zPep0ii`Mmp-P*e4F9Stb)#hq{rH6<~`Wl9bp)-tNJvy2#aS%{UTeX!sKp7-vB!2@@ zV%#hfEP<_MfI3iFEHY=8gA~!JMufIDH5y@w_|KdQ_*4|98I2WdQ;)f=C6Gm@ddd(2zfKkWy(IWo!MIS9@$xaV= zOn7A+h4JEIh7m|L{UKRgUwud9yz?e!LwC`B*)b0EkIRfG-XA^C%K+|*UYR8@P~6Bg z8K3RU(IYED5MC8Fu@Cl&Dq+Srm!xgWE=AZVX498&K?JNef}G3IuCMk&*d+e@UI|o- z1MeFF^(#T3g;&vAWUj4)k3`10a<(*fy%FfLWC!8%K^^3YHXAC~TFnL{=>M#3|F90* zsv>t&IgAmrHXD)m_lbhTAdQl5qNl~7v|~880>VW~o)KJcmQP{gO>B&+zEcn(1hZzv8Ki zIlC+1NfBING@MtIEp5Rt8Z7;lhgI?7r=@J7Z=o6UKvXOPbZ+7vo$IvsPjCZuAH(*Q zz);chb2Cm);7U>Z$!ltWa$OAG|E0B?r9O^1!|mcPU-U9j_IoGbUtjc7^=)fjs&Ct+ zQZutMHe3%)KLu3LxT2VugB1;A97K z0U;vsypcg|*ZHpjdW%&Tu5eAB12Y7}@l z0+jZuSo8IHX6Am=0A?i6=vgpNw7mKu&Rnh)UgbjOv1RT>Lz`uq*SB2A9DY-a{(%db zn{Q~oKXvoR@<^K01!8ej1Qm6GDBF#2cgjnp&RyXk458~?!ORaXTgvF@i;ya|#<$?T z?@0D;%#Np;ZicMnt0n=Qq<*cpMkR{c_k^=BpML3SOg`QV+9Rx^34P!+lv3ZmhQpnu zhvd@Z3Ep-K{j(n&h5@w2VGKDlE!`KMM9`?rA5OvrTGQW<(O0w(p$o+Zzy%maL4k(D z?4`P&IX=2U)M2V2;o5;G!C86milnz;K+dt(rJ-Ny?No5sJ;`eRIcUk|uFu7oL#;fxN_H1`=63M0y)m!aS z>jJWB8Q4?OrbkWsqOtF`&in262>(ax0k*neG!90}9E?f#mewQ)Lv4;Jqn~+yh<$Q? z-MV=mKSy@2AO3SNMzp}Rujr|9n2l9u==?a0vZbAIkDgtn;PF_+XTcVQMwh4aELeP% zCMrEK0ZUjSFxn7so^|)zmX87Fbnl6HmgU)Fk|`{!Ct(=CAnH9C%OHjRJ=qLNkRMLL zT);;xG$s~Lu#cVN%$RI>I}XDUI#KBJcmw*<;AzIl{_54z`vn|`FkOzFj{LqIN^|0k z89vkxuBiaUYM~DjcuheRpJ)ooAxRjDIBF7Q&cuEA=0pll#)fxiMn}_@Ss3MYbAtP} zFQaBDSO~|cJjK)j>Wk_Cd1f}|BGk~LId}`M(cCmcPI3b!1FfDefsZ@Pdinf3%z>xL zW47UL`svH2DX4*}06{z?niOdnM7Oi>GP14PoV3mP=j8~Qt|g-VV^xR0sY zMGd0T0d7BnVeRH$6I9KYda8BNW^yZq<56=q1bv(Kg%Rtw~^EDQka(EB%F z9q+>>fo3=0gS>b6a-C4S3Xj8OI`FQU=>)p=4*JLygues4MJxV+1=iy(Eo9nTZ$-2K#U1o1DZ^!l4V%GwSukfc0JIv!gWhWj%*6cp{xR=UO_+Gu0kAoW0E|6s!s~p-? zN-w}e)*-Gf-&e+_lck~Q`&B8Iz;|dtA%4a;O~7ZS>zB>P1fVCwG=nyPudZ)U}VdgRd^90og$9oY1m2KPMBHGE;xxrh!0ul z^V4_?{AlGFQ$+9M${A<5h5|v`&T)i_Xz_Vdj5}{VfROwPtj--v7JzR(lv`%7r(vr`xp?>CI6u{n<2~?n|1**H1~2Cx5{{ zx)|auQ}b@5zcNSmsY8cO#{BkY$o@*AeCrN&bMw4oC-%JRzkkN_0m>11;de{}Yn1Ca zeLjL`={(7F7Rg21RD>U7mPK6(*5_S164!nj%9_~tGRGZ2K%TTf%}7T9U90@?Z`3yR(f?(djRaCz|IZh LPc#8|5Kc_ZF2OTjilk(qegtt@yP(jd`fq(1t9JLw(d| zghD35nk(Ndnj(Z!qoyX+V#CHXti{Uje82ZzU4DPv*Xuld&ikCt`*Y6u-h02=7|U$X z*zY@R?u1Wl8Fn6~jkgsAt($;?Ac#6)r7a8T9Hnjhg7DvV#){5rz#|d^JI|8gc{k}IwxsC*FW42%=y_;>kFu-5L)GSu>pp(&6pNm*<#CXqRw=?$Gz~ZNb zYYwav1a+@b!&&$g2WB_b+hH6DS`gWdH>>LhIT)j+4g)+C%#OeB&(Abq6?2=_mv4$f z8{81YbYUS{k05K`n<7gJI|eQ+Fx^5c!eriCDA*w+8nf)iUBVNeb+y3GO*-G%YS zyvY7Qiu*I3D@1_p%wzTgIKZ6d82CbWs4}J=j0X1ZQhRZrV8b5Ft%Kg|>O6x)crF27 z9*eJvgM@CZ%YvKW#bBWvc&6fG(s>FIEHvsoY-2s64aS6J<5BbyBH4|_g^J(aH@13LM_YNTmYTe>UdchZ;VM8fe^+{ zZ^?xewldMcALV0`F(#=1A&w2(dInB0%{EIA0QN;nC-xw@5!SG~+Y2C%W$v&9K`?%i z(g9!{W2xuKZR)O<+=lOIgbnQNv_f*z>}_#V&aD5Y5&uQ@$G-ERV_E4IS4wMhBigBS zLNl^98HJ!{S28TFae$AI^*LMuj;!&pa$9O(fp^Q9_jeaGtwb})blwik@yIDnZ+Z_3 zDQ^sRV9$=YNUDoi4Ju-Z!1`tV)S|yU$$@o0X4b1k58*ztfb2reo0bE##A^L<7c)KP zFDHNlg$Kwc=bRltxcy+QdBu|sHbctvb6|;i`@xyLlW#Dl<<|m~ zu(&g4;1w27Am^LNHm-6tE<7uWa?Xnj<(v%{l;cW(ZThjT%1yY5Y{R8fqzEjsR_KI3 zki}mg3eVs@$0KD3n8tc_ybXSWyig2;1R$iS1w^#_H3EIdZd`vt*M*~ruf+yyUw zV*p%(54iLe7^E(4@CL#PK1dJcu%EYcCmFSy2&$FHuMLDEc!Pg4NRB60IMoy0K}g~? z-f$I8@vOlw#`#x%Cw#{c_y=0?q@hp+y?NBzbfTHYUV^|+_&^JfxuX*}@PxkboXOrq zI9@dj3gJz@Z#cP{`kPE(wa!geQauYa&gRndjT$=OvOl;GBk843JDMdu83n@udh&My z$UiLrssU{HszA6xrI|Fg1+qk?Q64Bi@-7ftd2FyLpqZ{7L|1-pJP=>`n)hB%4J5+y zOA~+?%M&MBtEdZmN!KQW%vydYREZWZ5p9D}bK8PC*q%_2{Q%PFHXnXqsV?z%3^jf} zcp4CWdF$zBXX0<8%w7J^hd|`zIg#XHX0HL%dZjEli>}_07tJz(`59=e+HvhiK*Z(^ zACXkKgjS+nPt4}NAHzj5Z#Um$t}wbxt#=omArD>%KanjQa$v8uGMZHF`vF#nXV}P5s9VIbFI}`tBzXfls*(w%Qww z8FiBuM2}uM=Gfper=mS9sGpZsw_w`Nsy>HC?rd}4KE0x&AJ4lEp<3tgUvX+(sUdb~ z>vnG0z3pXbKORyA&eDKnDCjE3eVlEI8*!ZC+I7iGxbH$5wcdW# zXjacZIOMf^Yy4I?&g#@LIdZsyW@F5v)BX2_1+6+XCFiy8CJ!bsK-9vB-ilw|T1VgkLCDxR0L_S~wUM833321I9Y8pNFko!-@0%~XNLh=8H zlgeH09q&!WYt)uq-zQIM%h%;u-Hk5@!*eWhqb(m9j{l(Q;$oOj?F|*gaGOOY^1%^nYaH4 zO$!VDF7nWMc#ay_n;)aH97wOv#{k5MllX@VF&C32a;HW3@|GVR!goYrh+WqZ>soxw zAsUavQJxcRI*Zq}5eG@XeS+x-XZYsNumLXeHA@Hr~(ISSJd2AUP%eRtk%5vNd9^7xmi?*w2yL*iM>sZVs z?Zj0tX=y0k;0NO{i!N^ZYAS!rSA)t^9%UJ8N$0_*t$W$gOSs05ZNQ^6j^}*!+)*CK zqPMU?I=l%x0nF!xn-xccoZoEVH3_(cxG;rbGyQ~aF;hbMj_u;vgMZ!LVLe5V|%Oc?^gz)48blzqjmLVse zfn!8qlKr}JKKLx2=M}YR%eCiB4@)9q*`wx`g;4YVB4p1BF@;!>a)Dgw z^&CV^lSN%}*f$`MPk2H-PZb_Mh4V!pnrcSPlt%WQAEiq!Lde-WB=N>sU$Kr;;S;W|#jB9YD{JMtH&D*J zu?~039y@O06?l~|xMeDv{KX-C{VUokrAxn!#l+LacT8^dSuFEZrSlSEdCu>2+230- z>;491mimWsCo?7LH*~`oV8xm z$&M#MlsgwKw)%lWkfc_Ly=Aeh`nh0rDoVSli|RrzB!jRHbAjEQ)9u6m_x|4h^DIYkU>Y%V z_$gWqm~)fz4aL$#FULu_9C94TTexSv)MW@uwtt5EdYP0mhEh}a`e-!57K{&3+TOl? zx-rP^q%9z3n5iw@fsghKO{FKI4QXaqfL1b-NX{ykgyi9`T?NDLk!I&m`vd<9^O(#) zsZ|o2+dY?oOT{#DxCgWBbWnDQuZz~de~J3!DR@lvrDfYLgd2j*Cp|3^b6Qo_-yj0UJ%0s{w4>{}$*&g$R}GdqpxRz^dba06m|_Ws}MI8A?c3 zrA_qsQUog}@|1UCR#%{GJt6Bz39XuqWO8MzG+O&$T6GfKX69-qD7yAjYP#48j-Pe{ zN<7_jzkx&4dPWUcGb~;esJljwyg+wrqL5GCb81k`VmmLR?)Tp=o?Ighcm|=6N@~?m z#rF>AtXB^%*60;ujp{T2?H+l7kkud@%_z zk*9>VSBhk^O$%cEAqQ+a!0qMZl@<$)Bu1v8h~7suVRq#hpk5%MV**NPvO^1?8+MV6 XUXu~r?8o&~fMU{jYC-Hvr?~SEOs`xb delta 713 zcmY+BT}YE*6vv-)UNdiWugxaH(3&6Fgm5ft6*5Im+;)OJvfB0vhYoHs93 zJdB??ls90yP<-Wv=?xjw8a~fGCD)8*71G;l{v9)QFKMiQU!q>DyDp_LpYh^>4c%Kw z9d3JF>>eMCNPhm}si-JPxjjwrroKx=UoN@wFXC@4X?10iVeQ(wmE_cU!9kV+Jw?=C z7R-Cyh@X%Wi>6@{Ef?v9i24~IYe_VxW@;g$I2J^nZTQC}5JR0MOR$A%jbS)YD#LF` zw@c?Bi8}X(sjEB&+JwjDMi5>8KxkZ~$p}#^;@byzp#`Oknk(;ug3=F$Q>Lm|e9zJG zDo>Q03v096WYlfUSnaEPN zUKfwwk!I`W#L&>uAoT+d*^uoeO|p iIQnt!2`K4)S4h0mU51b?MA|n3q>=o5h;HbSB>e&N&h~5o diff --git a/resources/app-mpr-v2/mprcontents/82/d3/82d3944d-781d-454f-b408-15318fdc23b8.mxunit b/resources/app-mpr-v2/mprcontents/82/d3/82d3944d-781d-454f-b408-15318fdc23b8.mxunit index 10864f8a6bd0d77ab228f4dcd77d52a9d14c0fa6..ac635b5dbe1c5563da1b5379f98f41bae68402b8 100644 GIT binary patch delta 1231 zcma*mT}V@57zgn4JZF||&2v^cBQ+`nSN0{f%FOB9*k&u8pOv9_T3W-}fvuV8Dw2Y{ zNQB2w(+aw<4-1MH0x!ZKDzXnv$$}^-3c3g)yr@M`2QgSTo^$)>{qg5{c%QGm*wc@= zxZ@7WdYo#bu-+lIw{e`fo5Wzjm?p*AmiX|D%t{t`K-?OPPqTvT>Ov7wu+UI)G4^M&dFF3(Fc0Zh+F{B}O`=G; zR~-Dlt9$#>jM)RM* zP3kT1Eb$)+$iXTp6p;2Estn&Gz_8LFpMRRRyQZ zN&!WlUYEasd>W`w1t%+a0P;F|UiBDq==?5K5Zvv;#6QYcOUNj4Qs+uDjaOd*8%6f2 z(&>G-*O;J^_02(HTe;P=A{c{gN|R?3Op+%saV|fz?e|tQ zm4ybBqF87)Hhm7`VIL%}`bU>~aGd9jRx#dwuta8=ON^!@NBP#aOh_?~D!^BRXmF*ZK(J%ihoJ1-Q$mUwjK%t?# zET#Wl&&}fSgh{&Ww?^i0f8HK4x?s&eZ@67_Z#7O^9zjjvF+8lZqh#@%QFC`#vDCNz z*q4GX7y@#Vu-I_^1KqTYBNc^R*Ws|h2B%SfigY1mDETAlDRz5wdeyGv0lO5`W0LH6q8 zf35;04eCEZD0QVcaopg8t4MQ(83>}m)Gd7rU=u4QGsvCB?08l5aWmi#r1tceu$OW& zoU7Zj)M%IJM%D!QQ%Sa?%{!5V@R4riK7l<{oaaobKn*dXzd*IM?eIyb+6#U0C(>r& zjNHx?In-l^d`0Qjx-%v6r;>k&NXE$1@?I{!TmD}}u~T%UbP9+zOLf9hW|Hs=(s0F7 z2%&~b$5@qBX#gsERJ{RS^q@vZma;K1SF1!^Kw3UMCZ|Jne^Vn!(afFJ>pw#<%{MrB o_N)o;n?#}3XK;YNS{?eqmWdE6qMN({_EBo{*2Y~Tx#gAe4@ZUl#Q*>R diff --git a/resources/app-mpr-v2/mprcontents/83/52/83528a06-83f9-45a3-8413-a1a245079dbf.mxunit b/resources/app-mpr-v2/mprcontents/83/52/83528a06-83f9-45a3-8413-a1a245079dbf.mxunit index 039a2d981233ef4f4cf9b76dc066ca4961641dba..5879e70f13155a4dac15d9562a0eafbc93103ee3 100644 GIT binary patch delta 1188 zcma)+T}YF06vqGOyjxB8@xF@9lokd;l4e^WRDRUlY_|EaRkK=5(lwZ7n`xHKu&6G= zi&mVe7eY4)i!wC+S3;Q7P4=;N72Qa75#1Ca1r-tXvJ`f;*V~8ZcOK63|F{;z>D!3Y zHy+{r90@NoCYc#B#smxdHq0OAGz-$*p-eSC#EbN5kb==nwJl1OhPRULVx~A6;RRwN zNX~GkS{>#+(iTKR8O8EjaAGTepZ|3o)*_{f&d{LAK(1n!)M*|a+iiU3z8*TH|8i%f zf`2fT0bkhkaWgL4Xr}rmme$k$8n5`unmPOeP1Y>H6oqRWiv#DnBH^}lNwJX{9M8c{hDK#H?k`YPF;Sqs&J@&;)}??f0*v#@W)H~oue4+{r;9k=>H(Al znsO&$9}Ri30es%G1R6oLQb9?nk>(CRfIZZGBpa5_v3U<5{H2kjPoR#R$FlkV_ucNx z126COiRnd7Cm$ZUBu<{#(+I RXGgV>%u&VCK1auO{{RoCNp=7L delta 777 zcmY+BT}YE*6vv-)-jo*V`)W4R)KsQ6FZ@U=)5O`-oYi!c7=~Y|q~-jqhD$F>nIw_P zk-A8tD2YY4XdIPU1 zr12)kq-chWF(HNxHSxQOoq}XCJJWJA_jPvxX>)@!jcA}qk8$a($r)Buac?mLq(GxH z6^*=73Px0@sohJDXV&p4ug|U+FVLv35r>hI{c@$3o#<6Ft=FACA9;D|Pw#K~68eL} z)&9~6vA643c8~T-$cvQ)$2D6i(-JS~>ogOuEG;P=l?5X+m!?B$!4g1ymMEH4i(>EC z!->{?+OF$rRT>X??Wnm^R74mbS@R(fttr%>a0-7VQ(9t<*q!XWY#v=rd<^YWza@jn z(7`K`ZXO4CQ_{usVF;%K+hmo_>6FXA+P+}1UgWQ&=enD)mRd69y3)lytE9ThK58Q~FC|?F zRPuK_;=mTA)XU4dWf=g!Ar)qiKnO(|>;aR2GXmA^8UlYx*e!d}Iq3-R$&`B^f@#wp z#~$T*o)FK?d7?eCZLfpg$@jtUNMreahc=YwNXmyJNO2?>15@iLDsSu&W#?3ACU&D zAJ}>=HA}tO0PggxZWdJ3UoXR+Ls@|H0xcXKga{fqBGX%@9E2q9W?lslMj=OKy1MbK F+g~R22vPt5 diff --git a/resources/app-mpr-v2/mprcontents/8a/34/8a349320-91c5-41f4-bc69-ff7644a67ada.mxunit b/resources/app-mpr-v2/mprcontents/8a/34/8a349320-91c5-41f4-bc69-ff7644a67ada.mxunit index 6b29532338c7479eb88a64f61d8e0281c60c4a20..abed2514a8987f4969be0b1a791faa71166eb508 100644 GIT binary patch delta 2514 zcma*ne@v8h90%~{^L_5Ox+uVF9waS6@sMMP67Zm5tF{`sHlgGokPD*C zBLpgS(C6xlqM<_8%v{}hWU6u-sJ_JlyPH zXP4xGoKX=xwN$WsGi5>yN%)YhknBukEw-^Jl1cD|+zr?|6pxd+`SP`lmy9 zu%B>0((wSB7)k>CtVU+8mBV+D2|GTvej7>1#!Kr<44*F#E^uN&*#I2CS><_i*430b zD%O@hUsn3`bI()@vFiKY*btVsyV-d8$ArX)_}+#yQl`2$eZtBd9Jia$U18y66~`(7 zg>_aM0W$IZDsGwL$OAD=u;BUXpCJdmHQYqo#$q4_5r3>b2TQTn$qguuC4i^u;(@ZS z>WV>aNq&(R!trt)i)ttUB8yn^(x7AuEFwiQ;dy5Si%?4!Z!!{5hxwaMLORZH@k-gK zE0;*qfu{I1CRCdC!ZMs};zd1MY=AK>aZti$w-~f{Y~^KG+r}c$r=|)<5!b$YPVGs2 zjhFFkc^JTq1zW#Wk6X6!kFNr8k;u#}jgkh`pW1)C%WLPQcBST?)Vg-1F8&SdOoB@y>gX z&W9o(aXMss`e6k+_wo`<=`JDgINSI3?ErQ>vM*eK!8;e?NOL0_?#&7z(|w0R$z(ko zN~WA6A!J(cNhp~bKlRJx?$c!Ysn0LdmnZ!)DW~#fLo9i7UH`~ao=V!CbRzBvO(r&Y zdPGy{&?QZ!+{^!0Y5(N`>3}M(hRoQpNbZ(;Hw#(k=(8G9(%2alnxV09Tl0S_ewnUL zXfoY88A0HNObdVW$u#qKZXzI4)>WTO#wl(fAd^G`8`yo;#ESn)^IhQPzj^upAmzC} z2sU(0^FmB3^~*%x1yE_Cl>~S(9Ca0WJ4E;cV4Ak+;V3MlN)$JC(#X0H=t2|pKsLQ#;-!7C`0b+C?tm#NHSm;q-<#;nIlQ$T$DZwTz2-aN3aFYRi%5icRB$?l{l}M2tMQJ?4+=* ODspL}_jL=@#QXzCpxR9U delta 1611 zcmZvceNa?o6vp?wyRIw4?p}g+i4T=;g$xisNFpQ+7b+PsA&~+4!$As?!cbs#X4j## zoJc(4n}&f2Ih2OX6}D-J&l+R_1FVP~jA(L=5S>*DW@PAo?8R;3-{(B%y!Sot@3}Ya zig%|JM7gn%JQGfySc;p&w=kELAY&qAL?)BTBW355h~WpA(Eo_uN>(4SQ_g%x1gl)M z?l!X}QE|ZNO){qeDihnYZdSp#mO86*CG61COMtmn?5wsGqixeqOyMDCarYZ+e~bYb zO}?`_pT`EpGK9FS#*J~?30;Lurx$xJ?nfnwmgAv>d~%hbEg_9bR?Tg-z7Vnv?aSYa zsWooFnv6aS|M__)FtMS&nJtQcZ)Z~txpdea;~S!x9Bq4Dljm?!?Y^;hR-L-oO$RrC zFJ`C4GPiA2K2wIW7cX4iuy^3-b6TmQ#_W+`w#aa6IkCoLW==Voi^Hj$UD~=h=kHC& zlzlz$A^PMRFtD@|t0$A#?AKl=WQt&aUN5Y~)A-C`zy%T%d{Bt(JXl2 z`qK-Ik!;2p4IvW*^Qt-_2*b}BIQMS=YAmX@K_F(<2wux*03-vsC&#)^yC4*E&x^Os zs@+9Yu^iCCdL#GhaOkrc2*%zEVp~!e)DZU7FREQgx|t=-n-{@7#j+Ugds-I5z2KWg za8GSr4EHbFMBLjuc-&d0^R9q8^a!XI^rSJ?W7avpq27eXw!yTMG3R|2P{01l;jz}4 zu5Djmc}&rfY%Ud0&uxXZ0XO>+jx%J?N0&qgA@Np{l)~3dfi|A&MMjJ$tD5w)Vn<9{`W*yc+6cm%%xqsb?eY%f5183 zzQ5qmsx(r4M~@D#PhaI|tNPnf=YUt)B{nL0bqKRpIP{xm9d!Qa1I=A3v@OKJa&Z~( zd7v#Wj(Jibs8S7FBIvMMD2S1uUJP)Vpfijhjsj%S7R&9!9QwYcj#9E$R4UYo^)0aaX1Gr3hX#NF9pELOY diff --git a/resources/app-mpr-v2/mprcontents/8f/36/8f36ec3f-bf7b-4e7d-9791-c29d663466a6.mxunit b/resources/app-mpr-v2/mprcontents/8f/36/8f36ec3f-bf7b-4e7d-9791-c29d663466a6.mxunit index 1cbe6d13488e652ec0ac805d27c3e20c8c2ac486..5f1f0e874f4e44bd9015f78dff1d9cf1e0c3dbd2 100644 GIT binary patch delta 5436 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 CPe8T+ delta 3657 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 J&8|Koi~y;gxs?C_ delta 442 zcmcaKm+|H-My5#LjZAKg0s=k^3<3rWObiSR%!Uk%KAR&LS1K@tYENcXN?>}TIXP7+ zRG>!_Sx8MKnA!B|WvI7-YW*!+)3tc`mWZ zjJoR?4JU8Zg=uJEWUSuIY!J-Is5Uv=5F|Qn^8{;8Miw)MuS}EY8=q!WpPX$1cGKnp zA3sJGW^)Fn$(zlt0IlsXhnWJgcJgscUZ&?vldoCs<4}WHYA7Z)d6Shk)L?H$MvuvN zY>qNEPF`dS(mi$a9J>`v9PePt`6R_ACpm6ll%Fi@1hG}h&4ZE4kl_PNg}=1e_WK#!07bBrAMCdBJ3xawZUF>SFx6kwco&WPchx0s4=jJfiv|$18hA)np=^-VD@Q2#ZEI>1vf3)e=!f8473OsbTR~Jy@e&BXiNAvx^z((Sd9zm9Fn|PsG5Vvqzy8K$RNe}8l zLX8Ii_R;giI=E>zsjDAPodPr)C^Pg1S}8rO3#cPOgos$UvI9!J+K-Xn)s4ee`gyfh KZzCU%rR2Xo%SFim delta 734 zcmY+BUr3X26o!B2e7U5W`^3_SnmM+$vcOVn=4^>JH`BGj%(N_(=32S_s5vtf3K~ZE z_n38)(S=0atsh+kX=WGJCME>oO%atEA!*u;kkGf*aNWMo^KuU71bVQ)3sKqT$4!8K zA1UFinD1juOk>Cx6LzyqAHNF*0h6xs_p1ybPF{(oWldZqJ1P@dU3B`?!`s%qMTG5C zrm$j%jz3b&$WSj(Pof83BSBKBs8PL3R%e%)y4UPlY7D9iC`~s;!$=+i z0XhBDYI)bjDJ2GS$-A!umyNVqU!oW=MsHe9=k#x&lQOf+#NFLIb^kNOA4t=NAZ(>4 zIpK7!BpXDTbPtQC%H<5*C7q@7MPocjQcUiOM0@iT5J#rGDcD9k^P@n8DG?WtE}JGG znM?&y#A}IzX701tLF!BvhROJ0JK!QxO7S?TXuf#GPl%P~m%2~8oDKD%P4sM9pbXn6 zY^L9~u(n_~A$+DR#|ucIB}b%N1fb`JQblM^(XmLH4b)Pegujsb$|oe>bv#0hK!cTQ zg*}YXNa!kofe_&HIyLa@bShC09yL$4b^V*k4?4WA9?@@Pyhe` diff --git a/resources/app-mpr-v2/mprcontents/99/85/9985993b-d286-4a00-811f-0faf257e9c45.mxunit b/resources/app-mpr-v2/mprcontents/99/85/9985993b-d286-4a00-811f-0faf257e9c45.mxunit index 50376cd1b6843d0e53191073a6c63b58ed5a9059..0d2e0438aca1f475635c075522ffa42ab251aefe 100644 GIT binary patch delta 1186 zcma)(T}V@57{|}^zFQuswsW9P5fl|d(uz7ZFM?Lg4K)^SQ)Xm>tmwl^%i0>o97D-U zmRmh*R+zAwSSFSplDw!W0{bu%${YKHvM7QmL9#CDw6@sQIo`hffA8=4KhKYlHWAj6 zL}4!pSV%3!28)GbDKOk>hA<36MP`cNsKvuIkj%%idTEPwrH1ROV=|*PQmkl{koh@S zZ7U`n%cNVjpEHPw;6O<=esJi}SZd?$KXHD#dAG6@zYY#B-Ynh0_@*IzVXu(-T<;f= zZx%f3X(8G9nB#Tnhs>G(`!M8v2;EqAxM;z4Pu2dKGWWqM_qKgI4l%RjVN)}s7>G)% zd;^5cr1-h+F>8{WXtOt3QFI9S?1({umBheHplcY1H0I|4O!%cI+E3-gH}msasq4p-=ti?qsNq*B)4Eb?gYY7jGh=~ zH>BCx3IT)7N~~N<9@Q7(3Dsb8Xb{$7$w{R_lQKg~0bzfqE%r(Q!;y=y9&=AAq5oV3 z$g?h*I#a|gpclW(8{HjMNByyRgr|5WHX^%rwyFbxHa*Q{7Gmh!E1B4HemVpXevGs| zg6p{Tf>J)Y2xI$g!fMlP_+0{W@dV`KjkqcrzETV{k6D3lE={pw`U}`A;ABGSVt>78 zY!{_>9Xdj?C{A?Vla2kCr(tveEXTK9AHj?duBzta-F9GSYf`6LazH>`PbU;&e~&5} XzUCrOE{*rj1+d_+K2_kklsNqdx07Vw delta 742 zcmZXRYeFX%VFq5d%Vt(+O_Mz;G*v-I-F3xRW^!0hp@0|0TV`=hStoNkSgg&ZN zQ#_$strn&kcA2mi^0?p};wX`G&#^UF#^<=yd*hiV>Say|uiy77X#Mi?UlipsDw! zH$1ZHAF}`iH#o_4jS0kFBIn#N+kilmqkM+37)cL>V?gnFSA+HzKUyFRwb+;H8ZJ0g zJCmoCl^F93%ioUTIM^@FEVVajy-)3q43!K0kYybcN diff --git a/resources/app-mpr-v2/mprcontents/9e/2b/9e2b120b-e11a-4989-b9c9-350483a6c0b7.mxunit b/resources/app-mpr-v2/mprcontents/9e/2b/9e2b120b-e11a-4989-b9c9-350483a6c0b7.mxunit index 4e0ffede0a72128c3676c2ce9ede60d2749671da..51804cdb5fe23575ff24d2583d6b49e8f4902b6d 100644 GIT binary patch delta 1226 zcma))TS${(7{|ZoeYcv_<~OJXLV{#;(1pVpMlKH%Qo1at-bjQl%!o22MpPG>k&x>mLL#G#poV1ZYHzoH{y%>2|KaU;OK-iSM7wl{ z#Ar$JL)@-4ih)T%5EBF<2m;j!7dz3Vb%~ogLqmDz-90NZF`_Lr{MpJP66GMyw1lP) zS}y ztK)dAWXl04WOH^kfB`=rnGZyy*njG|B6W?g%hsT}j>ofAzpF`2s0=SO zJ%N2#+{}G+d`l)#{9ZFz@-!&5jlls-Ji|rPx>Esj+m%ql%Gx6#cvX7`7xFtTAlK;x zHN}B0e^69?mdm7d=K*X*PtSa?fBf8k^mBkF3a!|C{u$iHa(6g_jk*s~BB%JxGYJ`Z z-y5#H`fsIy0-#AkJieD!K!M(|Z*H;x delta 776 zcmYk3ZAg=06o%h(UX4j@do`ITrkiQg@-sE|N9HtaeNKN^P*&6uc8V@RQiCph{2sBO(V zbCMrvy2q6@Tp-P*Pmoj{Mx4f<%X&U)h?`zH)R#0pgGpyCk)x7{uoPuI)!$MH1$|5lC$ZbPqnbpJEau^gDMC?|o$g z=yZXQjb&nazdTO>DTSX?Z*nn+NLR2ZkZhqHjL_QasUg8}$I${vw5=*BHufU&n8tsLfcwbWr!aQYO z90D0hFWGe~h*a9LJbmHD|3@RavN9DtCXT>A>a)N$RRU2W3L@abM(&-s1M=leb9jNZXi60vUN z8Rh{l3{yTNq~2jckd6r`2m-ST@nL=sDi}Hk_!q+oki`CtyMx#GE@PunD(cy|`lFp+ z&z?mz7E-mI2E>`_jmP&VVrGw?CcVFyHbhJ0dx)ZUc)_9MQt%lBIC$Qh; zE9EZ`w=sHYOPOqHqbzf+Bblqvqe_bg%EA5(Sh3*aPpV`98%m1k*~EmaG(FI^@GW=UZg;wK%G{R)jN>gen5#)v*(lP zR0gH0y$bofTCCbiP3rQ=$P5(ny@N8^@7Kz?D*NkqqG@H_QgA?_$eD*wNf^*V*IY_a zh5#=NilAO&=~;ci9omU9qj+deHJm)B4|t;@J1*o?`22U3D8H~7LWTi~MnAv=Sz=oA ztMv^{uMo2sy={ICb{dT90+BW^uo9t&#xMObS=rhTrO!tdnr_j0o&Pp6G+8-M9` delta 739 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 Ng`9dEOhxkD{}0xHl8pcW delta 3771 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 QWh($ delta 755 zcmZvaeMnOQ6vf}Y&*jqG-pmgKD-%sEip;*Cow>XuukkO+FzzcD_PSTTiJo`m zag~)R#peeo%~ZJJP|lo6N`u;cV;;R8>V-P0 z{h%R_$veW$j~$3Vk<_2wK?r$&)(9Sx?}6&ZeApN!MmRRA0+APd`NNfsT>e}(K8!W5wkgfi%1preh8)XIVoM?P~i+qw;gXF zm~`Jaycs`^pnO8SmMknim8xC_(6f0x?4;ZUDRslClE<-<-t{Vg+MG_Y%djZv!^?rV zgfzcw6;qun8`RfRJpYOE(z2rB^*=bkFvPBY6&<$K|2txs(-gMW2SoF08bRyIX3>uI z2Iz!v{v5#iSaUwYaR4Q6Vqq2h_+}50Yh4y|zYG+J-;f{k1dAAWB>x-80ydWM;q6{9 y3t_y~TT*(qKsMk4%Lgi;8+P-f3P~7Hf({|c9N`Q80K534t?MQA=2$B2}SrFhd#5EvVD z;gh^5GU$T|t-v~ngft^RRvFF0aISO}j`e}AMkN!&-j>0x-nZL_|L^>s|KXg(sNe|* z)RTXYZjxxojX9D6eBmAu%l0p_FKoq@7^9$(>i{-`;=8*`p&zbf9)#-9`Y`1r{63X z7`sXfD)HpF&G5V;{qS}i8h@(2!wAt7R99idlZ`h5MOzzM8=cK3>drUT)t@_afozbM zUfUfV!E4wuBk=ks1C*|3xMgAj$}l={Q~~0S;9FpONiENOVFWq8EvOQo11Q4smr|2T_4qfy9)-khveeW=UJKP{_;PB5ia8J!ZYYc*P>EB)wv<= zr&Pl*Kk*1EaXz66_?K&dm5|-2|B(bUYJaK`*bq1KjZ1n;GZ^M2AIq9(QVrt%tbNssIDo4m)elsvvs1H!`j-5&yt>cb@kaf2@- zb%_r)flj#otLR{i=hGD9h3uJyw6R;_Szibc1z!lKS*{YiqL=LZZs#YJ=H8f=LL7>< zSV=L@Lb+7)a|@c|$tV3V~GK?WUF<6){S8B#B=tr~U@e;)D2X{3n}tJ8Zmx=gL0I+cGVCtJVr(@4hX@3`blrHTJj zEz6=HyBUZk?5?6^a}j*wWD(*hQkA0_w$ZsMSEbX_Cjrz{J2MZyWSn)uvbk8qaiqTa z7N`2?&#IaV-uszS#+XM)N+N0A_z^6cA%rZ8E~8~B4RBIc>I3g!XXzJMq0c)2GSKtT Y>R4rqpBN{H-w-Mu@Ng^P8{ksFKjlU$qyPW_ diff --git a/resources/app-mpr-v2/mprcontents/c4/8c/c48cbe23-57ee-477c-a76b-6489592fff08.mxunit b/resources/app-mpr-v2/mprcontents/c4/8c/c48cbe23-57ee-477c-a76b-6489592fff08.mxunit index d6e0846059c47a391296c585a62fce125fb039a5..ab9b7fe73963c76bdb4d217ffbea24442f335e99 100644 GIT binary patch delta 9590 zcmbW6d0bW17RT?}`=Un$yolb)$T?>X1ZTa9BZdRwfTEy)l{1<=F?u;rX_=O~#pP7e zOCyJzu6i1r%}ON)N-IAKIA9r;nl@MtZ|!r>VaWH{_kJFK^4Y(&_Fil4wa@pi&zCq3 zY;>>#HMX%dU~_}S4CwBt9b~sTLT$`uv+*#SBS;*B=N+pYW&gRr;qJ%$z>!e3?0@@L z70LXJ!yZ`npT7mTqwKxFvB|&ef8X|ZzvFk>-*NZ>FXJojs{7??nVjVnxhpzTf?4fu z?uktraJD-`ENR{!`rxT_c-(!r`N>e$nTg{Glf(y41&Th2(T=1U_m)>%5EZw0_s14`BON|sNkH@u+)8W<3XlnS=z2GoMP+d58;SN z+~QTc>@OJXeq(DUgSsNnod^BI1-DA1*X_iA0jMKt>^crH;_@!lVs{h$CO}j1_{UeY zZj?mhXm7pZ6tzETraIKr-Mmo0VP_m5T{PQW1dBw_9+e|~U{4;#$kS{43L#32+pk(| z#7qo09P3_sfHP<$mLED#qUoP`6}bl-9>QRdSocMtHq|;$Qdg&V?@Q%*?hWEE=-F{R z7_d%tHjjc_aP&M(7JH7VT{^QjidVn618HK`>GO~!63!^)ZzuA$3)SH4nlXV$3W#*r;BwF?5!efi?N>_ zeuNxsMw$;2qkFNmZ8T7`(8eE1X+)zoav92$53r7aew6|(wdlPR}fgOP64_~F6)glS6BtA+QY+aPhs&BPz>Gh z+gj=!Q_ZZvtvS4}4t3xGKtqIja9azt3aHBnCkEH|y7LvwGFkIo4IqHQNIkG2IKenL zwrT{bDla*74DbkBTO8N~{={~15GX$kRKn8hm8|z|PFrS-zcy{)Y}$AobBniOFXUKND^UG%s%K!2TZcw6Oq83q}_D1BBtxChM6 zab^cNq`9p87o<3GR7YhNSD^4UU|jp8}7s}avy zk;=`Rjvp*w0Wt|ayTgG}w@G82*r11xZUa~d$Cka|w5N80dMityq;>{?JtD#ut%vr3 zia;gb?rE?4-2-}uzR(D?bnELdG1aNh>PK};2A1{r!2pthKulf90`(m+Pz4}W-#-wZ z1c<^bu|DYa9|uDV&}Ld2$WC|a;X}a>ARgPt`C_2saOeWe-%tN{JcI!Jj4MX?B3qRJ zdBCc1OdSQe)ZIIcR;#Esi+}~#acnZJcVX)k<$5D6;^am<23(`Ak~jvKgZG5hWnzfPo2E?E{E*OgMQzeAxJBhb+mkk8R-Yecj*$ebPo) zE*SwU-U0~;xbhYZsrnB}!27qTV0YsF+dl0uM!)(SJkKBtNB#*%;RrUm<6XDwFF3=X zE`EELqSy~N+*3*{EWrE+KwOaZAyYl11{Y{e&DM)sbHRzg*%2zqV_d03y8I>@Xz7;z z=5f*oRbXGjB0O6`skcA@2UcQ*T9jpB$~>|#pfXcEJf3_LHs}denB)db3Sa~d*dTDLeZ}5G(U*>Mu2BfrJsbpa~<6!1$(W zp$QV0+nf;yDln!q^X}sqlP#*NR*W9P6%Kzf8f| zH&opP4Z`?5PWq0-uy}SsOEf>;F!Tq~hmKI{%hSg21nPu2*dbB9cf)7mDDo+3<7g7| z&<4JptW1Z|c}q!S&lq-s%68#1N@ud{%kjmI=a}S+?6FFjWKxqaj*epnUmTslZbK;U zo2V92VhpHQ)&N5EqDkx~Xd|tRyt|GfdOMZf@s!`+Q+zwG2^lq~F%vTCq$!2wRi~?( zj071Wdf0SU!61$H>D2vQ_;6*1p-O;F4 zCmC4DSkBC%=|bT z)=h7@jn(Ju_Y54ggY}1(jX8zBX9uesCK2RF5%VBOk1H(N!9LF|UKkq@pBc0!`ph-$=QTH zw;h+m39QtSOAa~LQK>885QmEshhTwAx!fF3(5D2yLKS;2Qn?x_(%Hs9W7n>IPx<04{-J zPK;XjFmRlWC5Myoqd`hx32+1sK+sgWdN&lO77cMjtN4i0l6$ zKInq`-c$RbA}@y#SJrWf5qa+`Wd=s*G^U7VG@-b=o=bwbxk0U=43rYYBbzwQ+(+t_ zHq*`WU_*;7zMap+hQ8ali4C#al|u6(mtsT84(`E*2|KBgyRgMB<;JDn#D+m1QQxL< z!^b`dJlHVoQ)*i-Y`)v8q7bw$*7NIXOwUZ}UMlQPIC!5@D%0+nRb=evo>|2U2kG5* zVdq0ip*)re51s+Vn8W-S$wEK(S!PTn;=VM3_}CF&WELiLJ!Xhlt}h}B6Pg_7CMNiw zP-eX3Dp;7%>=dWp`MO!(%lm()Rv44VRllRk@L0$&@EdL*L&9lpAj9G_UbpR$ngfX~ z-${L{{^|GpNjZ?XaMl;S!3_`2af2Iz^0~nc5e2?T4Q`0Nz{_&ODbAfa;vz4@4WM~# zcxD(3Y}j7JJ=ie*2VMpnrnIDD9sHv@npCA8Y)JWuOKb=&R-VJipu`59rWWm=_%GXC Bx0L_@ delta 5555 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 delta 5647 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 T%^JH}PQHm|fo$DRz@PpHR9L`{ delta 4786 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 diff --git a/resources/app-mpr-v2/mprcontents/e0/f5/e0f5873c-1902-499c-a3cf-91146ed71fc0.mxunit b/resources/app-mpr-v2/mprcontents/e0/f5/e0f5873c-1902-499c-a3cf-91146ed71fc0.mxunit index 313ffd473618264d3486b0302ffaf3c6e051a4e8..29bcc5e76d82128d0f72b67f72e7f19275964aef 100644 GIT binary patch delta 1308 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 Gmi+&xu=x4_ delta 3446 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 delta 2631 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 SHh%*{ZPvQ delta 749 zcmYk3TS(J!6vzMP{57m_|NqFAh|XnRr-*A0GsU)5#PWtxPBhFyvn)1KG|aqA)D$n7 zoiNMFhmc+}sNd5dGW5YT6D6q!?`7Hz6En((sLlV1y?)O3d(QWqQ`e7gpCV@7dyECX z;z|R@i7^~<9LH<8xdvA5yWt_ex4F|v8>n()(- zVgD^^-y1=Fx6tPl~bgnS9vNG4jPxP*Y=EC<~2RR^o_}gruwZTTeYn8A7k#J#9Ae$-~f2 zuaZraU(~?{Q|yQ(PS@Q?4FvnFr zgO3~{Rg{7jG9xA5k1PeQA$ezyLmiNoN2!I#4|00ICuvn1XFuF4x1giXmP>w$eTziZ0t6Ow&~w zmT|ES@gve=`E#$3e_Lzx3L3Z+NzNN~SEK<5^!4%v_|Q_N6nVNzkN6oWz%~FOG;fn= zcSS1jI?kKI>XspxgnAPzt)B;6<;i?y5Y*(?C<(=;4D?FiUBMPi3aV@V1))^gBGpS; Hc~nTDJ0gQ-NO!TPeBX%dT^(4;7AUUVDX zEIQppNzhf4HtNL-D~u2$(wh*}Qp}K`iz1XFqMo@fyn6TEKAhkAo#%hfvr+xZ6Fu)a zImYuBen+p)MKOSf_7#)TRD>SuNw=1N6y&8{FoncrL=G zx4x~4OEi~@X*{Hn?Px3M9gGgdjzum+BR%K);%tW)?*EK5RDhexl{}1dL!QK#-qs#W zj;<6_ml2QQA(&KgMc|8&>R6{zX@(hsI8cz4_y{j!^kFmz;LG zoGh%|uM(>>1jQY0t~Bwpm}aZtP&tK6uXNN_ZkA}-E`s*bm_x$=H0^{*s%51#w;vw_ z^|VGKWyTOKIPnIf^uVRcWa1gF#dFT}5;eQ=68>BD8kl(xIv}~(KC(C97hGg(%ubOo zxs;lNFmj$Fk+%tx@Dn`QNk#ZN0XsRGu?8PmS~M_UTW|zCUq>E4UZIr`&;ZQ`5au|g SI727`0u*Z10F}4FD*pr9*gd)c delta 784 zcmZXR-Ahw(9LCS{J*n&EY)57rruo)%zR+sEwM?6$n3By3#Hfo5t;pDw6_ptE2UOOn zzF>8^0wJ^poxE6vA(oWbMNw#G3w1_mX(8TNBXjYxMS8vg)|T=%+otg!bsZVpdJr!8 z{Y>M?qA}oUzYtmQ?_JQ#Uu#jN#LXM!+=6M-*xBZ4U!t#XtG#~j63JBR=k0!R@>>G+ zmvATw*J#nr=MAVa`P|`g5A(1AuW_9ptVIRe3UEWcw+>xon9^EC*ec7E&Y*>xBy=E& zw-|M&E)BcD56zIo93e+-kP!_{I2XN2Fu};G8Dp^X{g{<>zyb@+5RY3hh(uPcD{&|m zMqE_qV{rfmyB_DtPYa)jL)LOucf1B^miXpo3?PM%C9L?vY|y5vJ=JjX_?f1q(Okl~ z$i5`>A)dX-x>}!tazc>XZRkcaH>T=9Ygq-j)JJxhpcM$DhY_v+R3@zShd3%rE0D|| zv%;_&>~Lbem@Nn#=fG!;FF00l2}ilmiGC;?mAy=RR7Vc35`~BZd3b?TzLc-O>(~ts z#5}>oy)G;uhP!v7Le*9qB>GM~SBM_X?VMTU%ub-`JV6Lj89O0mr_3d zgq{P+u458B%KbDUN;#o~5N0Pg(l`q#W#4~dewur!36zgxxz>d-Y-jJ4tE0JMYLq*r zI#3RdlpixfOjf@a z%gri&ttu<-8H^|UPDN7jNVGRLKz57r|L%Yp=N-)YB|dd@hSFUO+mA2EHR5*L`3Dvi z-PL+|o^gHxRzaG$zt#d!gPqQL9h|T)1C-&A>l=76<~H!Y1zc&}BUKVJ!`t3PsK)3C z-o3$p6-51Ws~++!v|Cx ziar82T6+wm8;Jn0N@Bx6Y)!UnM_jO}7(1gk#TFN*yY0N?Y$2t245RT`K`c$|fY=0Z z2!p-f!G%@l4gE@A5NLsfk>m^6rxkQnh%eP|RFH4Nl9#*)<=|7Z7jA;N;JW~1Q$M< zHljpD4nbV#O5MlnMii7NN~@Hvf5-EoQtMX4)o6kF5Wy`%*s z95br(7kSQfNstE48P)qq-ni^tBTjk9?7W5xZo26VTkpAzOc(uiPKwtB#!L-CA2nHJ zDsSIN-uMmv*!2kUJJM+LYjKTIe-XG-EmL%-2An_G4AN5NuHdPjSf6^IgE@G5cQsV_ z*&3N1xGOxp^jM*aik^?Ko}TOpEN)T<(Knwg{?ymxYh|kUKZH6e`VEXZP$iz#yUwkW zxg)R@ltJ;J26gY<2RM(EZ=Hs- z70H$;DB##8pxc|#D!D`;17X9r=N=(^cV9uWZE>SeTFy`M%cx>M{EFg O8Xi?+Ii5V@xBUYSz1^As diff --git a/resources/app-mpr-v2/mprcontents/ef/0f/ef0f9ac1-707b-4f12-a161-601aa16f5a4a.mxunit b/resources/app-mpr-v2/mprcontents/ef/0f/ef0f9ac1-707b-4f12-a161-601aa16f5a4a.mxunit index f48454dd2f44efab348546c5380cbec113a01eb5..cc8241ff676e87c69a10896a533d6d7432f3068b 100644 GIT binary patch delta 1327 zcma)*T}V@57{|}^zMCydJp96$*X%)$t<1AVMRgi!v{2bX5mYI9DET|NMXa9{#-VLl>PIpk(TU zm*j+#cRn-eiaj^j^ogyT4>t*kaZ6L_aXnmQb8M%PdI?{;bW$am=kvamC%usv0K=*+((XI;%<%m)>M6i!>Nw zlVt^4Hb5Rb(4+=P!T5W6IhkP715M=O&}jb#8F;E$mf%~AK!PcjJ`f-o6CJXEU`qnj zw*^5jD{eD_XnEEy2VqsCg4sKAfbbMQb}pz=w}%)l(V)?>iy=hmM3v;udu%=hGZ|zS7Y;^`gA#*x|L6xz6p8o|ch7HLOuUYhP5FvXgCXP&t3jc@<(9ML=JbF}{v6z>6 zJ83ts%u%S*t%pfvWp<%56N%6dO=DI_ zkwA+T(rJ4rpKcC3un|NxSgV}io>uWg z168yrHi2-OO1|b*(vi3}mb1$D zbz@`$X4iXi<@da>rqLHZvUt7m8IfQp@(95%m=(rfu zjAnwkWL&-&dwQd&)MNno1W0c@6v#YVH)_S$a5IAXTc!!Sl@Z}!_agB}TaSC*o?ZpO z7r?K5kBAKW`&G{13?aVw$2v!(Xusu-y`gCYey}LBJtpD!+2+>ifh-X0U_CQgPKz<) Q&R-IY$#>o7%E5B~f2(>hw*UYD diff --git a/resources/app-mpr-v2/mprcontents/f0/06/f0064893-3d06-4a11-8afd-7c3ad2b6e37f.mxunit b/resources/app-mpr-v2/mprcontents/f0/06/f0064893-3d06-4a11-8afd-7c3ad2b6e37f.mxunit index 3c43d185cb3f99acc948b21abacf52d5e3393cb3..f78a71567d5b948f6e0ce4f5f243b5ee9b5cbaea 100644 GIT binary patch delta 1206 zcma)(O-NK>6o&76?!9*NXXZ}k&HiQt6=T$Jl0k|z|Hy1%x)_CMGlh^*2K`weR2V@; zR(!@O1YM-GX<-aHt%`oMGOdWjjR|QXE-IQLn~dygPPn==+mG)#&wJhzx~6utspQ;w zmud&}{uW8n^CXfaN%ly6ErI<5xr%=N^wQUGW1xF*geY}`XdbSj?ySJj@UJ*3B=PL+ zAsU7#7^%}Ml?$y+bth_W+`~y%MPEqxr-nq&#Gb&z(GO1gS|)D)Xr+u&Q844P50xw( z-z3^+p5urO2fTG39<;!zR(KI z;A%!?xhQ^Ph>73X76W>VF$Otbst!#5aR7y4cFxLYejf+2*+uw>a#m$T`TYufDHSUf zuVk0mqvAETGR4I}85(ThV5Wu|XyyMG8Z)?UIjlCCuOw(zQUlUuzLkKN+O`OOX58Q_ ziI%vzp_%z=0u;VzLlVgf-?ZT=HnZPu8GFIIMaOo+9G_i*2Poo_WJ~0q%a;O&=93ps z);VeLxfF!VcAJbCXtUi_^>04(dOqLpIp1^6%?6dfPDOraD;0L? zuGLDCE=?jyk`z|yT&-tcXR=aPd}?vEx7^e08z9mri0a-vYP5KIdZ(9=O(DAa%c+Y* z)>1}jqJ@U5fKixv4?za?N*Ksbd{>D+#Bh~r zfw+U9!3po(t8E(*Wd-B*{YrQ zdCfZH65jEl6?lqRPSMX4Roh<+0;s z<+CqOmn420g`t4pN%a2&8B)pB82BK#J7zuzS6X28`i;0qG)7#r7SDoB@qJ4}2sNhSeH9u!%Unmdy50dee3kx^4B rc7VPpcsvcyk;q=FOzx+nfP(Fc`LCWHH?T1iQ;6rtb+SgA1+D%M96J1M diff --git a/resources/app-mpr-v2/mprcontents/f0/eb/f0eb8aaa-c979-42c4-9cb0-c0c7b4970765.mxunit b/resources/app-mpr-v2/mprcontents/f0/eb/f0eb8aaa-c979-42c4-9cb0-c0c7b4970765.mxunit index 458d60f6d9a900c16ff9dd501a5eebd7509c46d6..b39e818a0caf1286e4f8714b0dffd4973678eafb 100644 GIT binary patch delta 1195 zcma))T}YE*6vy9lo>|M(y+ijVmRTvS+KOgLM9$nCb4^@ZHcjngbF)~hiJImYr6Can z-kj1%jEKY=3FD!QLRv(zKCJAfs|tcNuZpg!t9r2+yL#Vl5C7luKfl8>I*N%g#Kh2D zEJzo}2L(agE}$R?%pwdAa!YzOL+1eR&m2#~8@=3^tpl;SCpA^uL(ZIcVn%oB@M;S; z8(bi|W2w_UF+M1*N6gwp6S*E7HS!<1-cIcrB<7OompWp3&3LtlTghRtN4xbgWp&r|IJ# zWa9dX{~`3yM~@;eV2UoERLU>vhocWso5qq~t$e3M<+0mfr@5Fa8t?P~D-q13YyAZl zTG6IPP&jJg+3i_~%NZ4RJeF(bJJcW^@ALv}A+hTV*yv}MYW{8ae$ZxWl14tOL}k4b dP)YN>s%X5=kI=vk=M4ZAWa?K1Gy@|Ue*iK~PJiy7>12w%A0ANe>w|mtkf#*_l25zstS}6Zkxs16=gxK>^V16=M9fk(G9C~ zgbS|prqW7!j#mQsMdFR147d_O7lS^pfCLujLMq`2V2&b(yIS!@s~RdZoOhNE+}h%I z4;AueEKJm+F(ML^V&z=N`qq}d2zhEtQB0cc-QpfR8k@j5OHu;zmTsqXR&_guZSuSL zhBM&rSP92>^dHXsVNbr_B)fBP>VwH8L}8jboX#qp!7!#lNAe~3m4x{kle9m{yW3oR zqYgzApP;jAsf_Sw2P( z=ga@rMRk)8_SDAEzzQ3{9AIzNuqbSK_Jz$nT8~Aed#UE?OhTl1^Y{{xVPDO^H0`O~ z0q_y<<;lk+40}!q^O&nM2)mULqx1B85{eFsfJf?$1QuA7HH?rbe9<7#iL)jUC9Al!XH+l&ncX)XO{rz9qo zd@A~KtsT(y5)J!ZvuBji=06wpa()%_Pd(-*F?{RGOJ|jYr0E|#1b+=b9LQ3tXV^DX zl=>?;ugo&G1*+lX0p$ra9#YTH8N7#n{0LTSD&#K!w@Q>NZAT1_loNz9r8Nne@s WV39Ey&I49|1l%VT5n+gvk#8 delta 358 zcmYk0J4k|I7=^#{W^Iv!GqZSAw-iRL{LVN?V?y8 zSG$w+Y~zG6rr)+TX5NT%#yrft)f3=~FD+B1F!0DF^EC{-Z_&hz+_id%K8bH^SFm%s zS5uc{cz6vum-rr6tHka3CN1C44p@O5g#}Uu=0ZIe=zQj z0K})BdlkJoR7b3XUWrTIOSQh^)9Oz^fFDNk*x;j4Ew(2!V_Bki;&Fcwo!mN6BXY_V zX>S@elQ>tGcDS)#lZiwX2mH~(AjKGy|yw}OUt->9`Yh&z#qW* Bf+hd} diff --git a/resources/app-mpr-v2/mprcontents/f6/a4/f6a40cf5-f574-4775-87b6-f623dd60e4ff.mxunit b/resources/app-mpr-v2/mprcontents/f6/a4/f6a40cf5-f574-4775-87b6-f623dd60e4ff.mxunit index c01e04f9e1da5b7e431edce03e2d812e1c5ba6f5..f4dd14227f8bbf6c583ae4af2f6ca49b1612bf78 100644 GIT binary patch delta 2297 zcma)+ZA=tb6o%*A*{#zGyR#7owQC^_{fL;zwxLvkU2wNcX|u@IZV?h_@S_1CvVulJ zP5nXQ2c|aZQLn#Rn>1(xNuk$twf-Q`rj26lCQT?Nf(2tsTN8x>ic#sE{m?N@=JNOC zy!U<2nK@6#L(A}fE7|1jB@IBDi?9j2>f$1h)EtROk|evN`yL#CX7zx_SZwt$AF+a3 z>NZx_xv^3nQg0U+i(>`MWATG}BHvg&l+TV?PZM?Ybz}ACFbgPGR+C9DzMOl6WUa@u zxgqjsrVK3PoLr)sz*-%QK;-B&?=RVruO3mpK3xYzxri4|`j1<1yeMK{2Q z`-=s=zW}CGq*-z$yNus>qfmhDKCy)QZ9rM4KM368Zi$&7Ho9jz2t<`J>#fU*Cpr4O zQ$zJ_!RS2SqJV?Q7F-ed3D)9xKxlTp%uiq*Nw5#xI1n`J=gZ;-LmM3sViOzfp!kyE z`m;1#8WM*~sYoXd8DFS~a52k=D zlCiyRfcyCCMJn!74zLQt4Szy0ZfX?uM?PN$8$e05Bo3!HN5ju{oPrYcH;J??BOD@7 z#dbF@1@PkG7Lh<7$-?S(ed{8PAF<5N4q3g{_UM{9k)mzvyRUu>X|qE8R-2wy^G= zi8VSkj{hE`#*1VBr$)!v1?a|i$3^zomsiFaOn7k#H#2Jw`6*OE``41Yl|7&(tPvGLynakk8+F7w# zf)NMr>WnC#GZW|zc)n}{YrS^|I48pQbx!0wFw^k;#yO#ck~j7BpoT5;Q;&(^ifYH& z!ECnpD{*2_B*2kDx5^+kPB4RZSb;->);+Z#4W|Y@q5#JRt$f;4p|2#y4VLj6~8gP`*AJc`3I7>*Xh2CBc-zz1_kkJthcaEEVLOmm9gx`r=dlqDll*sj!pfiQe SJtuTcLgf&Ny#G9OIsXH@N0e{? delta 1205 zcmZXTX-HI26vy8=&xvVq=2NkK(X)D-1{i)x`rbN&O9UEG5v(7K%A(XUQgsy@?BIl>`1xI1Dl zX!Gsi)Me*orn9IWnG#OV_;|MY<#@a|lg6eU#(r5KEOg`T#isxx6j61K=%v&Z~h0I=@KHGypjG zx5ZZZ?LdC;#tBPeupKFLNu9_ISt@BAkZ)ywb+V$+^5qQzJ6H7JNLWS1EAIhO<|=tv zE%&WHgxG`>SbGyj(~Wh;&Mn>?P}3AEnKpF7VCvqG#n*4FL;Q@CzNuCOJ2!=b3jrc& z#^#TZNMn5lj4Q|mY*ndX%PmNz)Iy!I8}YD+?Xn-Ut+a{07caDtun@hmkRlli%k=y5!G*XBeLK9Z$#C*yHHBI-s?A0 zy*-E5G& z7Nkc158Czq<9-^iA^SJ~2-#=7ZKJ)vE(#OUJB_J-OxW2aO_=rD79gPj-zLJ)R*u>OHp{^!xq20{~dKL&&+ z?C=o%;3#kLN>SL;p&(3Q)x&}~s0xdS1K|q06K8P0kR>0@8KIy0$ZH!*84152i6xKH OBT}0E=&wwIirBw;nxVb` diff --git a/resources/app-mpr-v2/mprcontents/fe/49/fe494e4a-98c1-4e3d-915e-e998b6982e56.mxunit b/resources/app-mpr-v2/mprcontents/fe/49/fe494e4a-98c1-4e3d-915e-e998b6982e56.mxunit index fb8e33764aeef5f710cf8354eb27613c4419322f..ac580d9a635df8bc669e51430d4b38c7efff3fdb 100644 GIT binary patch delta 5069 zcmb8ycTf~p90&0G{SM?*@b*+t7%O5!ClLci1w@1h4iPXJEQ~XX#EM8z)Y!1cUWOIl z*a2%28?JFB4n;5$u|$nJnpl$<+lY$29eMk9Z@nn9yZQHKzx%uQcHd{dJMU4Q{jcg^ zU|~MC&ckFMzI|Q<_sSbhTqhHnOeS-H>7F+~JuidH_|K2Sz4vXl0(NXH*tYDk;#3P? zDqP??xj6@0x(Pe>_Xh5wtMjkNTm}1&L(JSrWWSo_A^WR^)PkPCrQ5-2^f0?n_|qKZ z4!m~$_3T?duJ8i4@Qumo(%?)XsE7`$n(qATU(u=Xvgfw3d*2u^kAR zr~Yn+k0SW5?k`8bUi_2$3Dy(g&I2a%11pcgPTu!Hv`=!z=(KVDlg5uu8a8(L1d}^m zud=sf_6t}=JW?T6=<_fIEp_Q$xcc>pqyk6e=+Vdbz z?Cl260jf!l+E5HVh`qLEP}%YoZfJu9(a#;MV2Pv$g*~_G%U;?2po7LESK@Rl8==ii zlB{r=&g{$?nK?KMtme+9ret7!xI$B18W>F3U^*G>2^FxHwDr==ux&Ze2#OG0&7{N| zN}v~+?W3O&Q#U~@n1f6m$q!B7B?OSIP4!b`>!pSN>{lVhQJctAIa3Mu)pv)5Gcu6=&m^f^;R|tB zJ1`?8iuwNF2@pZbI~bUp(-F4T!{AIYDi~_uO56|vHFzaH2?GWei4O-!ERl-!RMLu& zXkc8C`h6gV%RHIo{w!OF|E@uFPC-Dy1O}G4G6tAfWYQRr$Rf2;-~+SBm=vIBk-)JA zmO<4jK&)#fzofx&OQ`bDh_yEuJOU21#Dn8OQj1hf&>X9r92%o+k;;ic-6H2E8Of+{ zt)4=UTL?KbMK^T?fQV0~QG?XeO|0?YMUrReza8)J8b6ca6+TOQpo-V1ISj8(b2YD* zUwevIZ=`O;f6LtB7HDRa?UUTHBq*;t88?8g=*vY=^=^^2L}`(WH5aMe%YoR0r3|si zWk&vhirAPH46*2y22&DZ%?8=#bqUA58JSO!{A4g+mlu7QjS+Udz@Fff!_wh_hnoiNoM&%Pxm4#J16Ox#ycqjQ!+H99w> zNOA5^F>{VJGqH6EuxduIT)}QeImON|$$RUK^)CnR@U+)!G4+CrjNR*F3U)Vc%h;vg zsR6t5cNlh??&`0TRW$MFJ#gx1WOpfj2jVJ$wlq>*sd*FSyr|-}dL)Y%RAn$Gi8ts8 z6EEzkk&G%HNqNr53wfa%W8@8aMaiSE=D*gwUVdlPj&|iOV{WHiGo*I3?BD2P>_*lB z>h?gwDq0yLt7wN@P^xItTs4Erb}JPv*A1;~MHV9=hiO;qpj6EE)HM=PO*`*_QZWo9HLicGkW*O6|WAb?=I@8Bl6}+$J;4&;s3k*h z8{1Y<7VVHfy17do?MN4_siXOH#hN-=dN9fz?PLh5UzOsgp(xwcFcRgWwjvT^xZ`83 zG09(F8@$AK@9DIRhr4CFJfcu8YLAB_D{6B`;D<%+)(Dh}TK-4_+ai5liWf(rvt1=& z=tYuJP_oN5R`VwB+Z8m9e)!N>RGPt%ml%zAuZWX@*q0$juoHuU(m%*RvrqUgu}Zc%7Wh@LD!UGpOvhf|oFl z;`OeaEl;4&?fQKDA77Xc7cj^UFElb$h3wX12HDR`45lQ=?kz*<3-iEo%?#TZrq|^a zie7P9OfQbt4>~on?%7PQz}5OGS+7K*=oPz$>1A81pH%e8 dKP2lFk}K=gb2HV8eo*$`qMuaAI=LN1?qB&a!KVNK delta 3229 zcmZvedsJ1&6~^!07X>MB54nKW7if5s7|~@*eO$o=Aah5u-2`*%mA2e zw78a68t{@{ZnRvN-bLFro6vHiCITdXu#Ns4ETgqadPx}pwTYfLu^YCe)rEr8Fvy}> z>*_(v+0S>NH1UCLG;3HkpS>>49n#sH(y-OC;0xO9!WP@8vc-~jZn<7c%e0Ngrdm20 zR{^>N$fonZ#$tbREEK0&PMrUCB8KSY+?F)_2g>(b5~MzzXY+xP+YzU_s*G>k%XE|P z-MCCnuY>?{cO_1j3Y^#a_fOsuS>E}t(YCF7ZjrXHAw-Jl&M+^(>}@Xe{6+Qr8gr+7 z?9>WUnSd^mD!mW#^aQ&%{e%a`K)1II>h8yc2IY zzSQ>2tK`HVn&E)#*Aq$XM&TeyN`q)i%H0%n=%Le^;2rgn9DLD3zJIS0yyWt}NTtRV zF9R7F0B8Mt-F(Z<`>sGU4+d;925^x>9^M2$dFG%Nmd(Q+*oX4E;a2dJLmr9Mrbplc zS(ePvIH1cfJ&si9DLMfAkr)xKz--cipe-&!up@U6o$;2Q_)dU}FrD;FfJm}t8WfN^ zJ2Wfv?co7H2ML-4=U^7;p2TZgfp|HAGlVE}oWMXk5tFmnm25D;WW0}LuK`+V&1(|R zd<*({IvqLu47AZ`mXSx>0FuaAcen&H+3TV8R&pl87l^l!n5IHK_>jj_>1ukab^rs3 zm;r;}MnY$blhW0}Wbq7~uI%)LKEN&{n`c2Ity?&o)}?zPt#c;Zz2Sf0O_F^?mn2^> z1NQ34X+LO!K$7k+c3kR*FDqvPK##CQsSg5o0AF(bIZ^oCCwLT<^>e}A2@PA7w-&=V zL@UipU>u|suP|Utlk8-4wv^KQ6yMHE!M zvgY;EgW+RXD-AKgxF!|rK?R%qG6kL@n-r%2MVtH~mCiwBTcK>%TDc}0!oh>g+X$3w z(y@{MUmLWQXWs&qZL%QUHb>zm85uz7CaX7#goZac{tjixlVoIx1mS=ypJqcGIQVIj zBB8&bt$lJJ$clU1y9{@)?V|K2xUbpCaDQ%>_~i`uO}QNR%MAAmABf%*;8=zL|Q_tsy9CcScxh=j;C4t+M!SizW+G7njAAE{OMd;=;Gn zM%d6uM`-SbQ&b|4y6LFKu74%;2S`EeLGstT&_V_9PA{jyRve%AadBMkx6P^IaQ=~r zqyI;d5aL)o$i(41Boaa#v5%-YsGdF=p&54nJM;^sY-k0KgLYUAvkxjbo)HWqsz%VH zM{WcPRYn9tN0B|M7Eo``tE`&PJ0i0HqNwh-fb`AIs+@=IVs2q?@q%O2QLAe6pkL`t3P7U z6R#ZQ;YMUu;P@xb09S%adrUg2RuKHQNC?`qHdB^7Nld0l2-@?qkkQ_@g=QG->TAb0 z2i4ckK#o}clk5Li+Zp7rL;I8bwG*)u*=xs?%TOQ9<+WDS!}fC2{u9TfzPZC5-*-V_Kcn3Yy9o`+Lg8j_mrsdK~pO0x++o2kEU~ O0_Z#;_MifYH~t?f Date: Wed, 4 Mar 2026 22:47:48 +0100 Subject: [PATCH 2/7] implement example loop --- resources/app-mpr-v2/App.mpr | Bin 73728 -> 73728 bytes ...dcdb976-7319-422c-b7a2-bddc16a0d47c.mxunit | Bin 0 -> 2721 bytes ...fc1a4c2-a2e3-4c62-835c-34ec7c29cdfb.mxunit | Bin 0 -> 7006 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/app-mpr-v2/mprcontents/8d/cd/8dcdb976-7319-422c-b7a2-bddc16a0d47c.mxunit create mode 100644 resources/app-mpr-v2/mprcontents/ff/c1/ffc1a4c2-a2e3-4c62-835c-34ec7c29cdfb.mxunit diff --git a/resources/app-mpr-v2/App.mpr b/resources/app-mpr-v2/App.mpr index 8db8d51a1f87bdac2a21245e8697371f5018a786..4837ec7e4682b1d28ec8a79c461298b917a6c6c0 100644 GIT binary patch delta 385 zcmZoTz|wGlWr8##=R_H2M$U~1HU285$tDH{mS$$U21(}Tx+X~$sk)YFMya|fX2}*t z=0=HTCgv8K0$36lXHI6_;LXG(KRIB-i_KOW``8(yHlN%P#waGrtix2c^K7qVv5wRB zMSJgvEx1y{*tXep*LhdAc=pc>?4P%CFur65t2?yh;Qz;ql6;zDOy1OJp8d_(x}B4Q z@i)5+4|fFv|3ZEzzQ=qme5$<1cvE>9dFJw%abM@I*w`4sT_4lT#;&6y&ymWDZkMS% zuVS2^>m^skZ0&_VC){? fY#bEnom`%ltex+i8kQOyl;x9byWLEN@f0%vV`hur delta 167 zcmV;Y09gNkzyyH61dtm60+Ad;0RpjLd`~1}VKHGjIAJ#}WjQuEEi^eYIW0J4GcYYP zWivT6W@R#FV=!j2Py}EBn3DytOOsNt=mGBIB$^&ssG*bWo diff --git a/resources/app-mpr-v2/mprcontents/8d/cd/8dcdb976-7319-422c-b7a2-bddc16a0d47c.mxunit b/resources/app-mpr-v2/mprcontents/8d/cd/8dcdb976-7319-422c-b7a2-bddc16a0d47c.mxunit new file mode 100644 index 0000000000000000000000000000000000000000..799f6cf62a330653b56f6cca05609933a89ed34d GIT binary patch literal 2721 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 Wxa|;i=adh$Rd0Q`N9(6r;ehFykxzlbq zP|?LccI4?bgbWGO9pJerp5*ePuM+#G#U{r+@aU90sn*o&)D)06;Z&SOxnrUp0Nec> zCA4Ay@q@kp$vS~Y6mI60H})UA|FpIn3rvbAH*k|8!SxVaTtpcocP!cnBGtnZ3D}Rd zjly#%2h$8$H@a5Gj-r|(!~6|p-FXH;KJFn{4z*X<>x(k41?In6shNt(IQGRPo2Uli z*wRmTryE?LRaF6YMETEyTb+9)YV8tiH%!;H_!ju26ZEsC<=(=a99vrl9=s|!$)mYC z1SUm9JJMBhv4$9%EQ>xa;+l)GDNsbbK?NgHK_hbW_)yRpT1trXZVUueYht9Hk1xUH zfZbxJVCOkfR}}Sg6p5Q7xXT>8lF>F)A-Ct&G=B56v4@m*|1SK4*Jn2TG)8>sZ4>5(hFO1WH?A*p z4DD68Vk6#HoV%}BGxfL;h%hF0mgn!2hzbVtUj0YiYx7t{I^% z8>OfW%OWQH5z*X5zm~9$cL%-Ufl$Ar)3AsQ1gK!#3p>);xE(&}RR4>6=jSWO2OY23 z`|MfO=k_Gco3VEZLYR`;0+24H3i`bOf)>cgOT>g{qY=br=bo!d7uv?zK^(-8LshjK zQ;$PHfwn;LQ2(LI7!Z~ZT~nsReWfl7BDoBwFIHDaglI-)q!6V~CZuJjWq}f;vmI=(sTONFE2b Date: Wed, 4 Mar 2026 23:48:06 +0100 Subject: [PATCH 3/7] Implement pseudocode generation --- mpr/microflow.go | 150 ++-- mpr/microflow_pseudocode.go | 777 ++++++++++++++++++ mpr/microflow_pseudocode_test.go | 60 ++ mpr/microflow_test.go | 39 + mpr/mpr.go | 4 +- resources/app-mpr-v2/App.mpr | Bin 73728 -> 73728 bytes ...dcdb976-7319-422c-b7a2-bddc16a0d47c.mxunit | Bin 2721 -> 6158 bytes ...fc1a4c2-a2e3-4c62-835c-34ec7c29cdfb.mxunit | Bin 7006 -> 7005 bytes 8 files changed, 977 insertions(+), 53 deletions(-) create mode 100644 mpr/microflow_pseudocode.go create mode 100644 mpr/microflow_pseudocode_test.go diff --git a/mpr/microflow.go b/mpr/microflow.go index 3a6c1c3..e5a6442 100644 --- a/mpr/microflow.go +++ b/mpr/microflow.go @@ -1,68 +1,93 @@ package mpr +const microflowDocumentType = "Microflows$Microflow" + +func enrichMicroflowDocument(mf MxDocument, mode string) MxDocument { + mf = addMicroflowPseudocode(mf) + if mode == "advanced" { + mf = transformMicroflow(mf) + } + return mf +} + func transformMicroflow(mf MxDocument) MxDocument { - // Transform a microflow log.Infof("Transforming microflow %s", mf.Name) cleanedData := bsonToMap(mf.Attributes) + objs, flows, ok := extractMicroflowGraphData(mf.Name, cleanedData) + if !ok { + return mf + } + startEvent, ok := getMxMicroflowObjectByType(objs, "Microflows$StartEvent") + if !ok { + log.Warnf("StartEvent not found for microflow %s, skipping transformation", mf.Name) + return mf + } + + root := MxMicroflowNode{ + Type: startEvent.Type, + ID: startEvent.ID, + Attributes: startEvent.Attributes, + } + buildDAG(&root, nil, flows, objs) + mainFlow := make([]map[string]interface{}, 0) + labels := make(map[string]interface{}, 0) + extractMainFlow(&mainFlow, &root, &labels) + mf.Attributes["MainFunction"] = mainFlow + // remove ObjectCollection + delete(mf.Attributes, "ObjectCollection") + return mf +} + +func addMicroflowPseudocode(mf MxDocument) MxDocument { + cleanedData := bsonToMap(mf.Attributes) + pseudocode, err := generateMicroflowPseudocode(mf.Name, cleanedData) + if err != nil { + log.Warnf("Could not generate pseudocode for microflow %s: %v", mf.Name, err) + return mf + } + mf.Attributes["pseudocode"] = pseudocode + return mf +} - // Check if ObjectCollection exists +func extractMicroflowGraphData(name string, cleanedData map[string]interface{}) ([]MxMicroflowObject, []MxMicroflowEdge, bool) { objsCollectionRaw, ok := cleanedData["ObjectCollection"] if !ok || objsCollectionRaw == nil { - log.Warnf("ObjectCollection not found for microflow %s, skipping transformation", mf.Name) - return mf + log.Warnf("ObjectCollection not found for microflow %s, skipping transformation", name) + return nil, nil, false } objsCollection, ok := objsCollectionRaw.(map[string]interface{}) if !ok { - log.Warnf("ObjectCollection is not a map for microflow %s, skipping transformation", mf.Name) - return mf + log.Warnf("ObjectCollection is not a map for microflow %s, skipping transformation", name) + return nil, nil, false } objectsRaw, ok := objsCollection["Objects"] if !ok || objectsRaw == nil { - log.Warnf("Objects not found in ObjectCollection for microflow %s, skipping transformation", mf.Name) - return mf + log.Warnf("Objects not found in ObjectCollection for microflow %s, skipping transformation", name) + return nil, nil, false } objects, ok := objectsRaw.([]interface{}) if !ok { - log.Warnf("Objects is not a slice for microflow %s, skipping transformation", mf.Name) - return mf + log.Warnf("Objects is not a slice for microflow %s, skipping transformation", name) + return nil, nil, false } - objs := convertToMxMicroflowObjects(objects) - - // Check if Flows exists flowsRaw, ok := cleanedData["Flows"] if !ok || flowsRaw == nil { - log.Warnf("Flows not found for microflow %s, skipping transformation", mf.Name) - return mf + log.Warnf("Flows not found for microflow %s, skipping transformation", name) + return nil, nil, false } flowsSlice, ok := flowsRaw.([]interface{}) if !ok { - log.Warnf("Flows is not a slice for microflow %s, skipping transformation", mf.Name) - return mf + log.Warnf("Flows is not a slice for microflow %s, skipping transformation", name) + return nil, nil, false } - flows := convertToMxMicroflowEdges(flowsSlice) - - startEvent := getMxMicroflowObjectByType(objs, "Microflows$StartEvent") - - root := MxMicroflowNode{ - Type: startEvent.Type, - ID: startEvent.ID, - Attributes: startEvent.Attributes, - } - buildDAG(&root, nil, flows, objs) - mainFlow := make([]map[string]interface{}, 0) - labels := make(map[string]interface{}, 0) - extractMainFlow(&mainFlow, &root, &labels) - mf.Attributes["MainFunction"] = mainFlow - // remove ObjectCollection - delete(mf.Attributes, "ObjectCollection") - return mf + return convertToMxMicroflowObjects(objects), convertToMxMicroflowEdges(flowsSlice), true } func extractMainFlow(mainFlow *[]map[string]interface{}, current *MxMicroflowNode, labels *map[string]interface{}) { @@ -138,7 +163,12 @@ func buildDAG(current *MxMicroflowNode, parent *MxMicroflowNode, flows []MxMicro return } case "Microflows$SequenceFlow": - obj := getMxMicroflowObjectByID(objects, current.Attributes["DestinationPointer"].(string)) + destination, _ := current.Attributes["DestinationPointer"].(string) + obj, ok := getMxMicroflowObjectByID(objects, destination) + if !ok { + log.Warnf("Destination object %s not found for sequence flow %s", destination, current.ID) + return + } objectNode := MxMicroflowNode{ Type: obj.Type, ID: obj.ID, @@ -183,31 +213,39 @@ func getMxMicroflowEdgesByOrigin(edges []MxMicroflowEdge, originId string) []MxM return result } -func getMxMicroflowObjectByType(objs []MxMicroflowObject, objType string) MxMicroflowObject { +func getMxMicroflowObjectByType(objs []MxMicroflowObject, objType string) (MxMicroflowObject, bool) { for _, obj := range objs { if obj.Type == objType { - return obj + return obj, true } } - panic("MPR file probably corrupted") + return MxMicroflowObject{}, false } -func getMxMicroflowObjectByID(objs []MxMicroflowObject, objID string) MxMicroflowObject { +func getMxMicroflowObjectByID(objs []MxMicroflowObject, objID string) (MxMicroflowObject, bool) { for _, obj := range objs { if obj.ID == objID { - return obj + return obj, true } } - panic("MPR file probably corrupted") + return MxMicroflowObject{}, false } func convertToMxMicroflowObjects(objs []interface{}) []MxMicroflowObject { - result := make([]MxMicroflowObject, len(objs)) + result := make([]MxMicroflowObject, 0, len(objs)) for _, o := range objs { - castedObject := o.(map[string]interface{}) + castedObject, ok := o.(map[string]interface{}) + if !ok { + continue + } + objType, _ := castedObject["$Type"].(string) + id := readMicroflowID(castedObject["$ID"]) + if objType == "" || id == "" { + continue + } result = append(result, MxMicroflowObject{ - Type: castedObject["$Type"].(string), - ID: castedObject["$ID"].(string), + Type: objType, + ID: id, Attributes: castedObject, }) } @@ -215,14 +253,24 @@ func convertToMxMicroflowObjects(objs []interface{}) []MxMicroflowObject { } func convertToMxMicroflowEdges(flows []interface{}) []MxMicroflowEdge { - result := make([]MxMicroflowEdge, len(flows)) + result := make([]MxMicroflowEdge, 0, len(flows)) for _, f := range flows { - castedFlow := f.(map[string]interface{}) + castedFlow, ok := f.(map[string]interface{}) + if !ok { + continue + } + flowType, _ := castedFlow["$Type"].(string) + id := readMicroflowID(castedFlow["$ID"]) + origin := readMicroflowID(castedFlow["OriginPointer"]) + destination := readMicroflowID(castedFlow["DestinationPointer"]) + if flowType == "" || id == "" || origin == "" || destination == "" { + continue + } result = append(result, MxMicroflowEdge{ - Type: castedFlow["$Type"].(string), - ID: castedFlow["$ID"].(string), - Origin: castedFlow["OriginPointer"].(string), - Destination: castedFlow["DestinationPointer"].(string), + Type: flowType, + ID: id, + Origin: origin, + Destination: destination, Attributes: castedFlow, }) } diff --git a/mpr/microflow_pseudocode.go b/mpr/microflow_pseudocode.go new file mode 100644 index 0000000..54777a0 --- /dev/null +++ b/mpr/microflow_pseudocode.go @@ -0,0 +1,777 @@ +package mpr + +import ( + "fmt" + "slices" + "strconv" + "strings" +) + +type microflowFlow struct { + ID string + Origin string + Destination string + CaseValues []string +} + +func generateMicroflowPseudocode(microflowName string, attributes map[string]interface{}) (string, error) { + graph, err := buildMicroflowGraph(attributes) + if err != nil { + return "", err + } + + orderedNodeIDs := traverseMicroflowNodes(graph.startID, graph.outgoing) + if len(orderedNodeIDs) == 0 { + return "", fmt.Errorf("no traversable nodes in microflow %s", microflowName) + } + + labelByID, needsLabel := computeLabels(graph, orderedNodeIDs) + + var b strings.Builder + b.WriteString(fmt.Sprintf("MICROFLOW: %s\n", microflowName)) + b.WriteString(fmt.Sprintf("RETURN TYPE: %s\n", extractReturnType(attributes))) + params := extractMicroflowParameters(graph.objectsByID) + if len(params) > 0 { + b.WriteString("PARAMETERS:\n") + for _, p := range params { + b.WriteString(fmt.Sprintf(" - %s\n", p)) + } + } + b.WriteString("\nPSEUDOCODE\n----------\n") + b.WriteString("BEGIN\n") + + for idx, nodeID := range orderedNodeIDs { + node := graph.objectsByID[nodeID] + nodeType, _ := node["$Type"].(string) + out := graph.outgoing[nodeID] + nextID := "" + if idx+1 < len(orderedNodeIDs) { + nextID = orderedNodeIDs[idx+1] + } + + if needsLabel[nodeID] { + b.WriteString(fmt.Sprintf(" LABEL %s\n", labelByID[nodeID])) + } + for _, line := range renderNodeInstruction(nodeID, node, nodeType, graph) { + b.WriteString(" " + line + "\n") + } + for _, line := range renderControlFlow(nodeType, node, out, labelByID, nextID) { + b.WriteString(" " + line + "\n") + } + b.WriteString("\n") + } + + b.WriteString("END") + return b.String(), nil +} + +func renderNodeInstruction(nodeID string, node map[string]interface{}, nodeType string, graph microflowGraph) []string { + switch nodeType { + case "Microflows$ActionActivity": + actionRaw, ok := node["Action"].(map[string]interface{}) + if !ok { + return []string{"// ActionActivity (unparsed action)"} + } + actionType, _ := actionRaw["$Type"].(string) + switch actionType { + case "Microflows$LogMessageAction": + msg := extractNestedString(actionRaw, "MessageTemplate", "Text") + return []string{fmt.Sprintf("log info: %q", msg)} + case "Microflows$CreateVariableAction": + name, _ := actionRaw["VariableName"].(string) + initial, _ := actionRaw["InitialValue"].(string) + return []string{fmt.Sprintf("%s = %s", name, initial)} + case "Microflows$ChangeVariableAction": + name, _ := actionRaw["ChangeVariableName"].(string) + value, _ := actionRaw["Value"].(string) + return []string{fmt.Sprintf("%s = %s", name, value)} + case "Microflows$RetrieveAction": + result, _ := actionRaw["ResultVariableName"].(string) + entity := extractNestedString(actionRaw, "RetrieveSource", "Entity") + if result == "" { + result = "" + } + if entity == "" { + entity = "" + } + return []string{fmt.Sprintf("%s = retrieve from database %s", result, entity)} + case "Microflows$ChangeAction": + return renderChangeAction(actionRaw) + case "Microflows$MicroflowCallAction": + return []string{renderMicroflowCallAction(actionRaw)} + default: + return []string{fmt.Sprintf("// action: %s", actionType)} + } + case "Microflows$ExclusiveSplit": + return nil + case "Microflows$ExclusiveMerge": + return nil + case "Microflows$LoopedActivity": + return renderLoopedActivity(nodeID, node, graph) + case "Microflows$StartEvent": + return nil + case "Microflows$EndEvent": + return nil + default: + return []string{fmt.Sprintf("// node: %s", nodeType)} + } +} + +func renderChangeAction(actionRaw map[string]interface{}) []string { + variableName, _ := actionRaw["ChangeVariableName"].(string) + if variableName == "" { + variableName = "" + } + lines := make([]string, 0) + + for _, item := range asObjectSlice(actionRaw["Items"]) { + itemType, _ := item["$Type"].(string) + if itemType != "Microflows$ChangeActionItem" { + continue + } + attribute, _ := item["Attribute"].(string) + value, _ := item["Value"].(string) + if value == "" { + value = "" + } + fieldName := attribute + if idx := strings.LastIndex(attribute, "."); idx >= 0 && idx+1 < len(attribute) { + fieldName = attribute[idx+1:] + } + if fieldName == "" { + fieldName = "" + } + lines = append(lines, fmt.Sprintf("%s.%s = %s", variableName, fieldName, value)) + } + if commit, _ := actionRaw["Commit"].(string); strings.EqualFold(commit, "yes") { + lines = append(lines, fmt.Sprintf("commit %s", variableName)) + } + if len(lines) == 0 { + lines = append(lines, "// change object") + } + return lines +} + +func renderMicroflowCallAction(actionRaw map[string]interface{}) string { + call, ok := actionRaw["MicroflowCall"].(map[string]interface{}) + if !ok { + return "call " + } + microflowName, _ := call["Microflow"].(string) + if microflowName == "" { + microflowName = "" + } + args := make([]string, 0) + for _, mapping := range asObjectSlice(call["ParameterMappings"]) { + param, _ := mapping["Parameter"].(string) + arg, _ := mapping["Argument"].(string) + if param == "" || arg == "" { + continue + } + shortParam := param + if idx := strings.LastIndex(param, "."); idx >= 0 && idx+1 < len(param) { + shortParam = param[idx+1:] + } + args = append(args, fmt.Sprintf("%s = %s", shortParam, arg)) + } + if len(args) == 0 { + return fmt.Sprintf("call %s()", microflowName) + } + return fmt.Sprintf("call %s(%s)", microflowName, strings.Join(args, ", ")) +} + +func renderLoopedActivity(nodeID string, node map[string]interface{}, graph microflowGraph) []string { + loopSource, _ := node["LoopSource"].(map[string]interface{}) + listName, _ := loopSource["ListVariableName"].(string) + iteratorName, _ := loopSource["VariableName"].(string) + if listName == "" { + listName = "" + } + if iteratorName == "" { + iteratorName = "" + } + + innerObjects := getLoopObjectCollectionObjects(node) + if len(innerObjects) == 0 { + return []string{fmt.Sprintf("FOR EACH %s IN %s", iteratorName, listName), "END FOR"} + } + + innerByID := make(map[string]map[string]interface{}, len(innerObjects)) + for _, obj := range innerObjects { + id := readMicroflowID(obj["$ID"]) + if id == "" { + continue + } + innerByID[id] = obj + } + if len(innerByID) == 0 { + return []string{fmt.Sprintf("FOR EACH %s IN %s", iteratorName, listName), "END FOR"} + } + + splitID, splitObj := findFirstExclusiveSplit(innerByID) + if splitID != "" { + branchFlows := make([]microflowFlow, 0, 2) + for _, f := range graph.outgoing[splitID] { + if _, ok := innerByID[f.Destination]; ok { + branchFlows = append(branchFlows, f) + } + } + if len(branchFlows) == 2 { + var trueDest, falseDest string + for _, f := range branchFlows { + switch firstCaseValue(f.CaseValues) { + case "true": + trueDest = f.Destination + case "false": + falseDest = f.Destination + } + } + if trueDest != "" && falseDest != "" { + expr := extractNestedString(splitObj, "SplitCondition", "Expression") + if expr == "" { + expr = "" + } + trueLines := collectLinearBranchLines(trueDest, innerByID, graph.outgoing, graph) + falseLines := collectLinearBranchLines(falseDest, innerByID, graph.outgoing, graph) + lines := []string{fmt.Sprintf("FOR EACH %s IN %s", iteratorName, listName)} + lines = append(lines, fmt.Sprintf(" IF %s THEN", expr)) + for _, l := range trueLines { + lines = append(lines, " "+l) + } + lines = append(lines, " ELSE") + for _, l := range falseLines { + lines = append(lines, " "+l) + } + lines = append(lines, " END IF") + lines = append(lines, "END FOR") + return lines + } + } + } + + lines := []string{fmt.Sprintf("FOR EACH %s IN %s", iteratorName, listName)} + entries := getInnerEntryNodes(innerByID, graph.outgoing) + for _, entry := range entries { + for _, l := range collectLinearBranchLines(entry, innerByID, graph.outgoing, graph) { + lines = append(lines, " "+l) + } + } + lines = append(lines, "END FOR") + return lines +} + +func traverseLoopBody(entryIDs []string, outgoing map[string][]microflowFlow, scope map[string]map[string]interface{}) []string { + visited := make(map[string]bool, len(scope)) + order := make([]string, 0, len(scope)) + var visit func(string) + visit = func(id string) { + if id == "" || visited[id] { + return + } + if _, ok := scope[id]; !ok { + return + } + visited[id] = true + order = append(order, id) + for _, edge := range outgoing[id] { + if _, ok := scope[edge.Destination]; ok { + visit(edge.Destination) + } + } + } + + for _, entry := range entryIDs { + visit(entry) + } + for id := range scope { + visit(id) + } + return order +} + +func getLoopObjectCollectionObjects(node map[string]interface{}) []map[string]interface{} { + collection, ok := node["ObjectCollection"].(map[string]interface{}) + if !ok { + return nil + } + return asObjectSlice(collection["Objects"]) +} + +func asObjectSlice(raw interface{}) []map[string]interface{} { + items, ok := raw.([]interface{}) + if !ok { + return nil + } + result := make([]map[string]interface{}, 0, len(items)) + for _, item := range items { + m, ok := item.(map[string]interface{}) + if !ok { + continue + } + result = append(result, m) + } + return result +} + +func firstIDSegment(id string) string { + if id == "" { + return "X" + } + parts := strings.Split(id, "-") + if len(parts) == 0 || parts[0] == "" { + return "X" + } + raw := parts[0] + var b strings.Builder + for _, r := range raw { + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') { + b.WriteRune(r) + } else { + b.WriteByte('_') + } + } + token := strings.Trim(b.String(), "_") + if token == "" { + return "X" + } + if len(token) > 12 { + token = token[:12] + } + return token +} + +func renderControlFlow(nodeType string, node map[string]interface{}, out []microflowFlow, labelByID map[string]string, nextID string) []string { + if nodeType == "Microflows$EndEvent" || nodeType == "Microflows$LoopedActivity" { + return nil + } + if len(out) == 0 { + return nil + } + + switch nodeType { + case "Microflows$ExclusiveSplit": + expr := extractNestedString(node, "SplitCondition", "Expression") + if expr == "" { + expr = "" + } + + // Fast path for two-way boolean split. + if len(out) == 2 { + var trueFlow *microflowFlow + var falseFlow *microflowFlow + for i := range out { + switch firstCaseValue(out[i].CaseValues) { + case "true": + trueFlow = &out[i] + case "false": + falseFlow = &out[i] + } + } + + if trueFlow != nil && falseFlow != nil { + trueLabel := labelByID[trueFlow.Destination] + falseLabel := labelByID[falseFlow.Destination] + if trueLabel == "" { + trueLabel = "" + } + if falseLabel == "" { + falseLabel = "" + } + return []string{ + fmt.Sprintf("IF %s THEN", expr), + fmt.Sprintf(" GOTO %s", trueLabel), + "ELSE", + fmt.Sprintf(" GOTO %s", falseLabel), + "END IF", + } + } + } + + // Generic split fallback, preserving all outgoing branches. + lines := []string{fmt.Sprintf("IF %s THEN", expr)} + for idx, flow := range out { + label := labelByID[flow.Destination] + if label == "" { + label = "" + } + caseLabel := strings.Join(flow.CaseValues, ", ") + if caseLabel == "" { + caseLabel = "default" + } + prefix := " GOTO" + if idx > 0 { + prefix = " // OR GOTO" + } + lines = append(lines, fmt.Sprintf("%s %s // case: %s", prefix, label, caseLabel)) + } + lines = append(lines, "END IF") + return lines + default: + dest := out[0].Destination + if dest == nextID { + return nil + } + return []string{fmt.Sprintf("GOTO %s", labelByID[dest])} + } +} + +func computeLabels(graph microflowGraph, orderedNodeIDs []string) (map[string]string, map[string]bool) { + nextByID := make(map[string]string, len(orderedNodeIDs)) + for i, id := range orderedNodeIDs { + if i+1 < len(orderedNodeIDs) { + nextByID[id] = orderedNodeIDs[i+1] + } + } + + incoming := make(map[string][]string) + for origin, outs := range graph.outgoing { + for _, edge := range outs { + incoming[edge.Destination] = append(incoming[edge.Destination], origin) + } + } + + needsLabel := make(map[string]bool, len(orderedNodeIDs)) + for _, id := range orderedNodeIDs { + preds := incoming[id] + if len(preds) == 0 { + continue + } + if len(preds) > 1 { + needsLabel[id] = true + continue + } + pred := preds[0] + predOut := graph.outgoing[pred] + if len(predOut) != 1 || nextByID[pred] != id { + needsLabel[id] = true + } + } + + labelByID := make(map[string]string) + labelCounter := 1 + for _, id := range orderedNodeIDs { + if needsLabel[id] { + labelByID[id] = fmt.Sprintf("L%03d", labelCounter) + labelCounter++ + } + } + return labelByID, needsLabel +} + +func findFirstExclusiveSplit(innerByID map[string]map[string]interface{}) (string, map[string]interface{}) { + ids := make([]string, 0, len(innerByID)) + for id := range innerByID { + ids = append(ids, id) + } + slices.Sort(ids) + for _, id := range ids { + obj := innerByID[id] + objType, _ := obj["$Type"].(string) + if objType == "Microflows$ExclusiveSplit" { + return id, obj + } + } + return "", nil +} + +func collectLinearBranchLines(startID string, scope map[string]map[string]interface{}, outgoing map[string][]microflowFlow, graph microflowGraph) []string { + lines := make([]string, 0) + visited := make(map[string]bool) + currentID := startID + for currentID != "" { + if visited[currentID] { + break + } + visited[currentID] = true + node, ok := scope[currentID] + if !ok { + break + } + nodeType, _ := node["$Type"].(string) + if nodeType == "Microflows$ExclusiveSplit" { + break + } + lines = append(lines, renderNodeInstruction(currentID, node, nodeType, graph)...) + next := "" + for _, flow := range outgoing[currentID] { + if _, ok := scope[flow.Destination]; ok { + next = flow.Destination + break + } + } + if next == "" { + break + } + currentID = next + } + if len(lines) == 0 { + lines = append(lines, "// no-op") + } + return lines +} + +func getInnerEntryNodes(scope map[string]map[string]interface{}, outgoing map[string][]microflowFlow) []string { + incoming := make(map[string]int, len(scope)) + for id := range scope { + incoming[id] = 0 + } + for origin, outs := range outgoing { + if _, ok := scope[origin]; !ok { + continue + } + for _, f := range outs { + if _, ok := scope[f.Destination]; ok { + incoming[f.Destination]++ + } + } + } + entries := make([]string, 0) + for id, count := range incoming { + if count == 0 { + entries = append(entries, id) + } + } + slices.Sort(entries) + if len(entries) == 0 { + for id := range scope { + entries = append(entries, id) + } + slices.Sort(entries) + } + return entries +} + +func firstCaseValue(values []string) string { + if len(values) == 0 { + return "" + } + return strings.ToLower(strings.TrimSpace(values[0])) +} + +func extractNestedString(m map[string]interface{}, keys ...string) string { + current := m + for i, key := range keys { + value, ok := current[key] + if !ok { + return "" + } + if i == len(keys)-1 { + s, _ := value.(string) + return s + } + next, ok := value.(map[string]interface{}) + if !ok { + return "" + } + current = next + } + return "" +} + +func extractReturnType(attributes map[string]interface{}) string { + rt, ok := attributes["MicroflowReturnType"].(map[string]interface{}) + if !ok { + return "unknown" + } + return formatDataType(rt) +} + +func extractMicroflowParameters(objectsByID map[string]map[string]interface{}) []string { + params := make([]string, 0) + for _, obj := range objectsByID { + objType, _ := obj["$Type"].(string) + if objType != "Microflows$MicroflowParameter" { + continue + } + name, _ := obj["Name"].(string) + varType, _ := obj["VariableType"].(map[string]interface{}) + required, _ := obj["IsRequired"].(bool) + requiredText := "optional" + if required { + requiredText = "required" + } + params = append(params, fmt.Sprintf("%s: %s (%s)", name, formatDataType(varType), requiredText)) + } + slices.Sort(params) + return params +} + +func formatDataType(raw map[string]interface{}) string { + typeName, _ := raw["$Type"].(string) + switch typeName { + case "DataTypes$VoidType": + return "void" + case "DataTypes$IntegerType": + return "integer" + case "DataTypes$BooleanType": + return "boolean" + case "DataTypes$StringType": + return "string" + case "DataTypes$ObjectType": + entity, _ := raw["Entity"].(string) + if entity == "" { + return "object" + } + return entity + default: + if typeName == "" { + return "unknown" + } + return typeName + } +} + +type microflowGraph struct { + objectsByID map[string]map[string]interface{} + outgoing map[string][]microflowFlow + startID string +} + +func buildMicroflowGraph(attributes map[string]interface{}) (microflowGraph, error) { + objectsByID := make(map[string]map[string]interface{}) + outgoing := make(map[string][]microflowFlow) + startID := "" + + objectCollectionRaw, ok := attributes["ObjectCollection"].(map[string]interface{}) + if !ok { + return microflowGraph{}, fmt.Errorf("ObjectCollection not found") + } + objectsRaw, ok := objectCollectionRaw["Objects"].([]interface{}) + if !ok { + return microflowGraph{}, fmt.Errorf("ObjectCollection.Objects not found") + } + + for _, item := range objectsRaw { + obj, ok := item.(map[string]interface{}) + if !ok { + continue + } + id := readMicroflowID(obj["$ID"]) + if id == "" { + continue + } + objectsByID[id] = obj + if objType, _ := obj["$Type"].(string); objType == "Microflows$StartEvent" { + startID = id + } + } + if startID == "" { + return microflowGraph{}, fmt.Errorf("start event not found") + } + + flowsRaw, ok := attributes["Flows"].([]interface{}) + if !ok { + return microflowGraph{}, fmt.Errorf("Flows not found") + } + + for _, item := range flowsRaw { + flowMap, ok := item.(map[string]interface{}) + if !ok { + continue + } + origin := readMicroflowID(flowMap["OriginPointer"]) + dest := readMicroflowID(flowMap["DestinationPointer"]) + if origin == "" || dest == "" { + continue + } + flow := microflowFlow{ + ID: readMicroflowID(flowMap["$ID"]), + Origin: origin, + Destination: dest, + CaseValues: extractCaseValues(flowMap["CaseValues"]), + } + outgoing[origin] = append(outgoing[origin], flow) + } + + return microflowGraph{ + objectsByID: objectsByID, + outgoing: outgoing, + startID: startID, + }, nil +} + +func extractCaseValues(raw interface{}) []string { + items, ok := raw.([]interface{}) + if !ok { + return nil + } + values := make([]string, 0, len(items)) + for _, item := range items { + c, ok := item.(map[string]interface{}) + if !ok { + continue + } + v, _ := c["Value"].(string) + if v != "" { + values = append(values, v) + } + } + return values +} + +func traverseMicroflowNodes(startID string, outgoing map[string][]microflowFlow) []string { + visited := make(map[string]bool) + order := make([]string, 0) + var visit func(string) + visit = func(id string) { + if id == "" || visited[id] { + return + } + visited[id] = true + order = append(order, id) + for _, edge := range outgoing[id] { + visit(edge.Destination) + } + } + visit(startID) + return order +} + +func readMicroflowID(raw interface{}) string { + switch value := raw.(type) { + case string: + return value + case map[string]interface{}: + // Raw YAML form: + // $ID: + // subtype: 0 + // data: [118, 185, ...] + dataRaw, ok := value["data"] + if !ok { + return "" + } + parts, ok := dataRaw.([]interface{}) + if !ok { + return "" + } + builder := strings.Builder{} + for idx, p := range parts { + if idx > 0 { + builder.WriteByte('-') + } + builder.WriteString(intLikeToString(p)) + } + return builder.String() + default: + return "" + } +} + +func intLikeToString(v interface{}) string { + switch n := v.(type) { + case int: + return strconv.Itoa(n) + case int32: + return strconv.Itoa(int(n)) + case int64: + return strconv.FormatInt(n, 10) + case uint64: + return strconv.FormatUint(n, 10) + case float64: + return strconv.Itoa(int(n)) + case float32: + return strconv.Itoa(int(n)) + default: + return "" + } +} diff --git a/mpr/microflow_pseudocode_test.go b/mpr/microflow_pseudocode_test.go new file mode 100644 index 0000000..14b4907 --- /dev/null +++ b/mpr/microflow_pseudocode_test.go @@ -0,0 +1,60 @@ +package mpr + +import ( + "os" + "strings" + "testing" + + "gopkg.in/yaml.v3" +) + +func TestGenerateMicroflowPseudocode_FromSubMicroflowExample(t *testing.T) { + data, err := os.ReadFile("../modelsource-v2/Module2/SubMicroflowExample.Microflows$Microflow.yaml") + if err != nil { + t.Fatalf("Failed to read sample microflow yaml: %v", err) + } + + var attrs map[string]interface{} + if err := yaml.Unmarshal(data, &attrs); err != nil { + t.Fatalf("Failed to parse sample microflow yaml: %v", err) + } + + pseudocode, err := generateMicroflowPseudocode("Module2.SubMicroflowExample", attrs) + if err != nil { + t.Fatalf("Failed to generate pseudocode: %v", err) + } + + if !strings.Contains(pseudocode, "IF $counter > 0 THEN") { + t.Fatalf("Expected pseudocode to include split condition") + } + if !strings.Contains(pseudocode, "counter = $counter - 1") { + t.Fatalf("Expected pseudocode to include decrement action") + } +} + +func TestGenerateMicroflowPseudocode_FromLoopMicroflowExample(t *testing.T) { + data, err := os.ReadFile("../modelsource-v2/Module2/MicroflowLoopExample.Microflows$Microflow.yaml") + if err != nil { + t.Fatalf("Failed to read sample microflow yaml: %v", err) + } + + var attrs map[string]interface{} + if err := yaml.Unmarshal(data, &attrs); err != nil { + t.Fatalf("Failed to parse sample microflow yaml: %v", err) + } + + pseudocode, err := generateMicroflowPseudocode("Module2.MicroflowLoopExample", attrs) + if err != nil { + t.Fatalf("Failed to generate pseudocode: %v", err) + } + + if !strings.Contains(pseudocode, "MICROFLOW: Module2.MicroflowLoopExample") { + t.Fatalf("Expected pseudocode header with microflow name") + } + if !strings.Contains(pseudocode, "FOR EACH IteratorUser IN UserList") { + t.Fatalf("Expected pseudocode to include structured FOR EACH loop") + } + if !strings.Contains(pseudocode, "call Module2.SubMicroflowExample(User = $IteratorUser)") { + t.Fatalf("Expected pseudocode to include microflow call in loop branch") + } +} diff --git a/mpr/microflow_test.go b/mpr/microflow_test.go index b1272f9..27ef8fe 100644 --- a/mpr/microflow_test.go +++ b/mpr/microflow_test.go @@ -3,6 +3,7 @@ package mpr import ( "os" + "strings" "testing" "go.mongodb.org/mongo-driver/bson" @@ -40,6 +41,40 @@ func TestMPRMicroflow(t *testing.T) { if len(sequence) != 5 { t.Errorf("Unexpected instructions length. Got: %d", len(sequence)) } + + pseudocode, ok := mfObj["pseudocode"].(string) + if !ok || pseudocode == "" { + t.Errorf("Expected pseudocode to be a non-empty string") + } + if ok && pseudocode != "" { + if !containsText(pseudocode, "BEGIN") || !containsText(pseudocode, "END") { + t.Errorf("Expected pseudocode to contain BEGIN/END structure") + } + } + }) + t.Run("microflow-simple-basic-mode-has-pseudocode", func(t *testing.T) { + if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, "basic", "MicroflowSimple"); err != nil { + t.Errorf("Failed to export units from MPR file") + } + + mfFile, err := os.ReadFile("./../tmp/MyFirstModule/Folder/MicroflowSimple.Microflows$Microflow.yaml") + if err != nil { + t.Errorf("Failed to read file: %v", err) + } + + var mfObj bson.M + var node yaml.Node + if err := yaml.Unmarshal(mfFile, &node); err != nil { + t.Errorf("Failed to unmarshal microflow file: %v", err) + } + if err := node.Decode(&mfObj); err != nil { + t.Errorf("Failed to decode microflow file: %v", err) + } + + pseudocode, ok := mfObj["pseudocode"].(string) + if !ok || pseudocode == "" { + t.Errorf("Expected pseudocode to be present in basic mode export") + } }) t.Run("microflow-with-split", func(t *testing.T) { if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, "advanced", ""); err != nil { @@ -133,3 +168,7 @@ func TestMPRMicroflow(t *testing.T) { } }) } + +func containsText(s string, needle string) bool { + return strings.Contains(strings.ToUpper(s), strings.ToUpper(needle)) +} diff --git a/mpr/mpr.go b/mpr/mpr.go index 93792d1..20993be 100644 --- a/mpr/mpr.go +++ b/mpr/mpr.go @@ -475,8 +475,8 @@ func getMxDocuments(units []MxUnit, folders []MxFolder, mode string) ([]MxDocume Attributes: unit.Contents, } - if mode == "advanced" && unit.Contents["$Type"] == "Microflows$Microflow" { - myDocument = transformMicroflow(myDocument) + if unit.Contents["$Type"] == microflowDocumentType { + myDocument = enrichMicroflowDocument(myDocument, mode) } documents = append(documents, myDocument) } diff --git a/resources/app-mpr-v2/App.mpr b/resources/app-mpr-v2/App.mpr index 4837ec7e4682b1d28ec8a79c461298b917a6c6c0..737b919ba4adfc94b30146d5d86789079f4c406f 100644 GIT binary patch delta 159 zcmZoTz|wGlWr8##|3n#QM*fWnHU26oiHW8r#%YPVmS!eKx+W=>$+{LvX_mTarUuD| z2IeNl28rgI0#={aj;x3ZG!8S13UKu>$}%?1ayPap5A-w2Nw+Z0&I~Lz&2g^b5|<$@7TJFLx^rs4z4Su&gjFD$UX_ zGt2dyeodOuMBCFi$JN6q(V)P@FW5gQEFjO&-N4vAz}Yw`(mT04Em=F?IW;UbI4H{} LdAq3$<7s99E`l+f diff --git a/resources/app-mpr-v2/mprcontents/8d/cd/8dcdb976-7319-422c-b7a2-bddc16a0d47c.mxunit b/resources/app-mpr-v2/mprcontents/8d/cd/8dcdb976-7319-422c-b7a2-bddc16a0d47c.mxunit index 799f6cf62a330653b56f6cca05609933a89ed34d..13723777c46ea8c5cdcbda0081a8f5a64a6fa26e 100644 GIT binary patch delta 1728 zcmb7Ee@q)y9Dnz&Emw@#WTX7rX2BAWjqLh^Zl!}#O2e7~S!CcJhUn2=;X-N4wFTy{ z;zkw%GTq)>B(O|a#=29+Fk(^06#6}rGl=_gO;#-`m-}HS(RuF?rdc7f`SGRzeo+J z$FJxCzWkX3e~wR;4O|{Mt-N*gXQ)1K(8q!-ys4UV@LreO+u>K+Ji%6$X9AqpV`cm- zfc1K6sc`3QQWfqe zZ6giW+jm_3$tOsnSpNOC<89_B-r%%`d;1B66F$(_x%%(^}p$3@%()9k>+XCXvvlLLGWYrcpvA+Jybg zl4KANjl-;eadcOlxThATpFdX7XCLK0{&g$SdIOVv79SR1#49DjxcwT}@JbzR8I@;f zazZUD0*q+qHByN~m5jDX($Op-NAJT;iELhwj6!2FqNH_C%*#bpNsJs10gv3$S_=OH zg&Nw3K9L?Kjd~rbl5HnSQKxK@q9RKZ#Yta7QbX&IA~`J^2c|T}z=Ukvpp^NxPKP__ z=i1p?pPLH+Xk~oDdePiZap;`(G6 zX_J8lq*%o2^*A}PNDD3!%|rP9kCWG$x$@V0in^!PdhbQ@pvIg2Ili4fp7r}NhPYzT zwy|PZho^RUgPs7(t4dWgu7LwP6T>&*PQrZAZ%JvEg&0_0t%kS)NAA?8 z5m>5NSXQ280&G3Qb4;TfnW_8`w0kg1#=U;M2wrKhB9R?z4b#d3!I%h0KyIvvcUBo* zi7NBWp*yDhF6X|n;kL|cr-*O_f)a14U;>PA!mqYtu1zd29tVIz{qinSYm9ik3j|{- zCWI7oPkH2ZHOn`#Xs0Z*SZ|1TQcs)oSWa>`=!sD?VfrF!hDKr*b-+V`8mQ#7$Q>_)_E9Pd URT|VQKb(X$GU@bMv^lx|ZzzHp+5i9m delta 143 zcmeA(SSZT0kZU88CnJ+M^JZVh$&8GRlOHloogBuh&e$+{9&;oM3j+hgcF&A4ZX=^9595Z(<~(7H5tI9PUNadPZ?5Kj#KhRXIZi-?k Date: Wed, 4 Mar 2026 23:57:15 +0100 Subject: [PATCH 4/7] remove mode and fix tests --- .github/workflows/ci.yml | 2 - README.md | 6 +- default.yaml | 1 - lint/config.go | 4 - lint/config_test.go | 7 +- main.go | 1 - mpr/microflow.go | 6 +- mpr/microflow_pseudocode_test.go | 160 +++++++++++++++++++++++++++---- mpr/microflow_test.go | 12 +-- mpr/mpr.go | 12 +-- mpr/mpr_test.go | 13 +-- mpr/mpr_v1_test.go | 8 +- mpr/mpr_v2_test.go | 4 +- serve/serve.go | 4 +- 14 files changed, 165 insertions(+), 75 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db9c695..e6d34b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,7 +101,6 @@ jobs: projectDirectory: resources/app-mpr-v1 modelsource: resources/modelsource-v1 export: - mode: basic filter: ".*" raw: false appstore: false @@ -132,7 +131,6 @@ jobs: projectDirectory: resources/app-mpr-v2 modelsource: resources/modelsource-v2 export: - mode: basic filter: ".*" raw: false appstore: false diff --git a/README.md b/README.md index 12d2af0..a7207bb 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,6 @@ mxlint-cli export-model [flags] |------|-------|---------|-------------| | `--input` | `-i` | `.` | Path to directory or mpr file to export. If it's a directory, all mpr files will be exported | | `--output` | `-o` | `modelsource` | Path to directory to write the yaml files. If it doesn't exist, it will be created | -| `--mode` | `-m` | `basic` | Export mode. Valid options: `basic`, `advanced` | | `--filter` | `-f` | | Regex pattern to filter units by name. Only units with names matching the pattern will be exported | | `--raw` | | `false` | If set, the output yaml will include all attributes as they are in the model | | `--appstore` | | `false` | If set, appstore modules will be included in the output | @@ -107,7 +106,6 @@ lint: export: output: modelsource input: . - mode: basic filter: "*" ``` @@ -166,7 +164,6 @@ mxlint-cli serve [flags] |------|-------|---------|-------------| | `--input` | `-i` | `.` | Path to directory or mpr file to export. If it's a directory, all mpr files will be exported | | `--output` | `-o` | `modelsource` | Path to directory to write the yaml files. If it doesn't exist, it will be created | -| `--mode` | `-m` | `basic` | Export mode. Valid options: `basic`, `advanced` | | `--rules` | `-r` | `.mendix-cache/rules` | Path to directory with rules | | `--port` | `-p` | `8082` | Port to run the server on | | `--debounce` | `-d` | `500` | Debounce time in milliseconds for file change events | @@ -336,7 +333,6 @@ INFO[0000] Starting server on port 8084 INFO[0000] Watching for changes in /Users/xcheng/project INFO[0000] Output directory: modelsource INFO[0000] Rules directory: rules -INFO[0000] Mode: basic INFO[0000] Debounce time: 500 ms INFO[0000] HTTP server listening on 127.0.0.1:8084 INFO[0000] Dashboard available at http://localhost:8084 @@ -374,7 +370,7 @@ INFO[0000] PASS no_allow_2 - Lint Mendix Yaml files for common mistakes and enforces best practices - Watch for changes and automatically re-lint - Serve lint results via HTTP for integration with other tools -- Microflow transformation to more readable format (advanced mode) +- Microflow transformation to more readable format - Support for both Rego and JavaScript rules - Human readable output diff --git a/default.yaml b/default.yaml index 036798c..3981c82 100644 --- a/default.yaml +++ b/default.yaml @@ -11,7 +11,6 @@ lint: modelsource: modelsource projectDirectory: . export: - mode: basic filter: ".*" raw: false appstore: false diff --git a/lint/config.go b/lint/config.go index 9a9576e..94c1480 100644 --- a/lint/config.go +++ b/lint/config.go @@ -28,7 +28,6 @@ type ConfigRulesSpec struct { } type ConfigExportSpec struct { - Mode string `yaml:"mode"` Filter string `yaml:"filter"` Raw *bool `yaml:"raw"` Appstore *bool `yaml:"appstore"` @@ -264,9 +263,6 @@ func mergeConfig(base *Config, overlay *Config) { base.Rules.Rulesets = append([]string{}, overlay.Rules.Rulesets...) } - if strings.TrimSpace(overlay.Export.Mode) != "" { - base.Export.Mode = strings.TrimSpace(overlay.Export.Mode) - } if overlay.Export.Filter != "" { base.Export.Filter = strings.TrimSpace(overlay.Export.Filter) } diff --git a/lint/config_test.go b/lint/config_test.go index 885a7f2..fe640d4 100644 --- a/lint/config_test.go +++ b/lint/config_test.go @@ -27,7 +27,6 @@ func TestLoadMergedConfig_ProjectOverridesSystem(t *testing.T) { modelsource: modelsource-system projectDirectory: ./system export: - mode: advanced filter: system/* lint: skip: @@ -42,7 +41,6 @@ lint: modelsource: modelsource projectDirectory: . export: - mode: basic filter: "*" lint: skip: @@ -78,7 +76,7 @@ lint: if len(cfg.Rules.Rulesets) != 1 || cfg.Rules.Rulesets[0] != "file://project-rules" { t.Fatalf("expected project rules.rulesets override, got %#v", cfg.Rules.Rulesets) } - if cfg.Modelsource != "modelsource" || cfg.ProjectDirectory != "." || cfg.Export.Mode != "basic" || cfg.Export.Filter != "*" { + if cfg.Modelsource != "modelsource" || cfg.ProjectDirectory != "." || cfg.Export.Filter != "*" { t.Fatalf("expected project config override, got modelsource=%s projectDirectory=%s export=%#v", cfg.Modelsource, cfg.ProjectDirectory, cfg.Export) } @@ -126,7 +124,6 @@ func TestLoadMergedConfig_DefaultConfigBase(t *testing.T) { modelsource: default-modelsource projectDirectory: ./default-input export: - mode: advanced filter: default/* ` setDefaultConfigForTest(t, defaultConfig) @@ -139,7 +136,7 @@ export: if cfg.Rules.Path != ".mendix-cache/default-rules" { t.Fatalf("expected default rules path, got %s", cfg.Rules.Path) } - if cfg.Modelsource != "default-modelsource" || cfg.ProjectDirectory != "./default-input" || cfg.Export.Mode != "advanced" || cfg.Export.Filter != "default/*" { + if cfg.Modelsource != "default-modelsource" || cfg.ProjectDirectory != "./default-input" || cfg.Export.Filter != "default/*" { t.Fatalf("expected default values, got modelsource=%s projectDirectory=%s export=%#v", cfg.Modelsource, cfg.ProjectDirectory, cfg.Export) } } diff --git a/main.go b/main.go index 43a892d..2c17cbe 100644 --- a/main.go +++ b/main.go @@ -56,7 +56,6 @@ func main() { inputDirectory, outputDirectory, boolValue(config.Export.Raw, false), - config.Export.Mode, boolValue(config.Export.Appstore, false), config.Export.Filter, ) diff --git a/mpr/microflow.go b/mpr/microflow.go index e5a6442..1b217e0 100644 --- a/mpr/microflow.go +++ b/mpr/microflow.go @@ -2,11 +2,9 @@ package mpr const microflowDocumentType = "Microflows$Microflow" -func enrichMicroflowDocument(mf MxDocument, mode string) MxDocument { +func enrichMicroflowDocument(mf MxDocument) MxDocument { mf = addMicroflowPseudocode(mf) - if mode == "advanced" { - mf = transformMicroflow(mf) - } + mf = transformMicroflow(mf) return mf } diff --git a/mpr/microflow_pseudocode_test.go b/mpr/microflow_pseudocode_test.go index 14b4907..1935366 100644 --- a/mpr/microflow_pseudocode_test.go +++ b/mpr/microflow_pseudocode_test.go @@ -1,23 +1,12 @@ package mpr import ( - "os" "strings" "testing" - - "gopkg.in/yaml.v3" ) func TestGenerateMicroflowPseudocode_FromSubMicroflowExample(t *testing.T) { - data, err := os.ReadFile("../modelsource-v2/Module2/SubMicroflowExample.Microflows$Microflow.yaml") - if err != nil { - t.Fatalf("Failed to read sample microflow yaml: %v", err) - } - - var attrs map[string]interface{} - if err := yaml.Unmarshal(data, &attrs); err != nil { - t.Fatalf("Failed to parse sample microflow yaml: %v", err) - } + attrs := subMicroflowFixture() pseudocode, err := generateMicroflowPseudocode("Module2.SubMicroflowExample", attrs) if err != nil { @@ -33,15 +22,7 @@ func TestGenerateMicroflowPseudocode_FromSubMicroflowExample(t *testing.T) { } func TestGenerateMicroflowPseudocode_FromLoopMicroflowExample(t *testing.T) { - data, err := os.ReadFile("../modelsource-v2/Module2/MicroflowLoopExample.Microflows$Microflow.yaml") - if err != nil { - t.Fatalf("Failed to read sample microflow yaml: %v", err) - } - - var attrs map[string]interface{} - if err := yaml.Unmarshal(data, &attrs); err != nil { - t.Fatalf("Failed to parse sample microflow yaml: %v", err) - } + attrs := loopMicroflowFixture() pseudocode, err := generateMicroflowPseudocode("Module2.MicroflowLoopExample", attrs) if err != nil { @@ -58,3 +39,140 @@ func TestGenerateMicroflowPseudocode_FromLoopMicroflowExample(t *testing.T) { t.Fatalf("Expected pseudocode to include microflow call in loop branch") } } + +func subMicroflowFixture() map[string]interface{} { + return map[string]interface{}{ + "MicroflowReturnType": map[string]interface{}{"$Type": "DataTypes$VoidType"}, + "ObjectCollection": map[string]interface{}{ + "Objects": []interface{}{ + map[string]interface{}{"$ID": "start", "$Type": "Microflows$StartEvent"}, + map[string]interface{}{ + "$ID": "create", + "$Type": "Microflows$ActionActivity", + "Action": map[string]interface{}{ + "$Type": "Microflows$CreateVariableAction", + "VariableName": "counter", + "InitialValue": "10", + "ErrorHandling": "Rollback", + }, + }, + map[string]interface{}{ + "$ID": "split", + "$Type": "Microflows$ExclusiveSplit", + "SplitCondition": map[string]interface{}{ + "Expression": "$counter > 0", + }, + }, + map[string]interface{}{ + "$ID": "decrement", + "$Type": "Microflows$ActionActivity", + "Action": map[string]interface{}{ + "$Type": "Microflows$ChangeVariableAction", + "ChangeVariableName": "counter", + "Value": "$counter - 1", + }, + }, + map[string]interface{}{"$ID": "end", "$Type": "Microflows$EndEvent"}, + }, + }, + "Flows": []interface{}{ + map[string]interface{}{"$ID": "f1", "OriginPointer": "start", "DestinationPointer": "create", "CaseValues": []interface{}{}}, + map[string]interface{}{"$ID": "f2", "OriginPointer": "create", "DestinationPointer": "split", "CaseValues": []interface{}{}}, + map[string]interface{}{"$ID": "f3", "OriginPointer": "split", "DestinationPointer": "decrement", "CaseValues": []interface{}{map[string]interface{}{"Value": "true"}}}, + map[string]interface{}{"$ID": "f4", "OriginPointer": "split", "DestinationPointer": "end", "CaseValues": []interface{}{map[string]interface{}{"Value": "false"}}}, + map[string]interface{}{"$ID": "f5", "OriginPointer": "decrement", "DestinationPointer": "split", "CaseValues": []interface{}{}}, + }, + } +} + +func loopMicroflowFixture() map[string]interface{} { + return map[string]interface{}{ + "MicroflowReturnType": map[string]interface{}{"$Type": "DataTypes$VoidType"}, + "ObjectCollection": map[string]interface{}{ + "Objects": []interface{}{ + map[string]interface{}{"$ID": "start", "$Type": "Microflows$StartEvent"}, + map[string]interface{}{ + "$ID": "retrieve", + "$Type": "Microflows$ActionActivity", + "Action": map[string]interface{}{ + "$Type": "Microflows$RetrieveAction", + "ResultVariableName": "UserList", + "RetrieveSource": map[string]interface{}{ + "Entity": "System.User", + }, + }, + }, + map[string]interface{}{ + "$ID": "loop", + "$Type": "Microflows$LoopedActivity", + "LoopSource": map[string]interface{}{ + "ListVariableName": "UserList", + "VariableName": "IteratorUser", + }, + "ObjectCollection": map[string]interface{}{ + "Objects": []interface{}{ + map[string]interface{}{ + "$ID": "loopSplit", + "$Type": "Microflows$ExclusiveSplit", + "SplitCondition": map[string]interface{}{ + "Expression": "$IteratorUser/Blocked", + }, + }, + map[string]interface{}{ + "$ID": "loopChange", + "$Type": "Microflows$ActionActivity", + "Action": map[string]interface{}{ + "$Type": "Microflows$ChangeAction", + "ChangeVariableName": "IteratorUser", + "Commit": "Yes", + "Items": []interface{}{ + map[string]interface{}{ + "$Type": "Microflows$ChangeActionItem", + "Attribute": "System.User.Blocked", + "Value": "false", + }, + }, + }, + }, + map[string]interface{}{ + "$ID": "loopCall", + "$Type": "Microflows$ActionActivity", + "Action": map[string]interface{}{ + "$Type": "Microflows$MicroflowCallAction", + "MicroflowCall": map[string]interface{}{ + "Microflow": "Module2.SubMicroflowExample", + "ParameterMappings": []interface{}{ + map[string]interface{}{ + "Parameter": "Module2.SubMicroflowExample.User", + "Argument": "$IteratorUser", + }, + }, + }, + }, + }, + map[string]interface{}{ + "$ID": "loopLog", + "$Type": "Microflows$ActionActivity", + "Action": map[string]interface{}{ + "$Type": "Microflows$LogMessageAction", + "MessageTemplate": map[string]interface{}{ + "Text": "User {1} not blocked", + }, + }, + }, + }, + }, + }, + map[string]interface{}{"$ID": "end", "$Type": "Microflows$EndEvent"}, + }, + }, + "Flows": []interface{}{ + map[string]interface{}{"$ID": "f1", "OriginPointer": "start", "DestinationPointer": "retrieve", "CaseValues": []interface{}{}}, + map[string]interface{}{"$ID": "f2", "OriginPointer": "retrieve", "DestinationPointer": "loop", "CaseValues": []interface{}{}}, + map[string]interface{}{"$ID": "f3", "OriginPointer": "loop", "DestinationPointer": "end", "CaseValues": []interface{}{}}, + map[string]interface{}{"$ID": "f4", "OriginPointer": "loopSplit", "DestinationPointer": "loopChange", "CaseValues": []interface{}{map[string]interface{}{"Value": "true"}}}, + map[string]interface{}{"$ID": "f5", "OriginPointer": "loopSplit", "DestinationPointer": "loopLog", "CaseValues": []interface{}{map[string]interface{}{"Value": "false"}}}, + map[string]interface{}{"$ID": "f6", "OriginPointer": "loopChange", "DestinationPointer": "loopCall", "CaseValues": []interface{}{}}, + }, + } +} diff --git a/mpr/microflow_test.go b/mpr/microflow_test.go index 27ef8fe..27e2245 100644 --- a/mpr/microflow_test.go +++ b/mpr/microflow_test.go @@ -14,7 +14,7 @@ import ( func TestMPRMicroflow(t *testing.T) { t.Run("microflow-simple", func(t *testing.T) { - if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, "advanced", ""); err != nil { + if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, ""); err != nil { t.Errorf("Failed to export units from MPR file") } @@ -52,8 +52,8 @@ func TestMPRMicroflow(t *testing.T) { } } }) - t.Run("microflow-simple-basic-mode-has-pseudocode", func(t *testing.T) { - if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, "basic", "MicroflowSimple"); err != nil { + t.Run("microflow-simple-has-pseudocode", func(t *testing.T) { + if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, "MicroflowSimple"); err != nil { t.Errorf("Failed to export units from MPR file") } @@ -73,11 +73,11 @@ func TestMPRMicroflow(t *testing.T) { pseudocode, ok := mfObj["pseudocode"].(string) if !ok || pseudocode == "" { - t.Errorf("Expected pseudocode to be present in basic mode export") + t.Errorf("Expected pseudocode to be present in export") } }) t.Run("microflow-with-split", func(t *testing.T) { - if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, "advanced", ""); err != nil { + if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, ""); err != nil { t.Errorf("Failed to export units from MPR file") } @@ -106,7 +106,7 @@ func TestMPRMicroflow(t *testing.T) { } }) t.Run("microflow-split-then-merge", func(t *testing.T) { - if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, "advanced", ""); err != nil { + if _, err := exportUnits("./../resources/app-mpr-v1/App.mpr", "./../tmp", true, ""); err != nil { t.Errorf("Failed to export units from MPR file") } diff --git a/mpr/mpr.go b/mpr/mpr.go index 20993be..9c2db21 100644 --- a/mpr/mpr.go +++ b/mpr/mpr.go @@ -31,7 +31,7 @@ const ( MaxComponentLength = 50 ) -func ExportModel(inputDirectory string, outputDirectory string, raw bool, mode string, appstore bool, filter string) error { +func ExportModel(inputDirectory string, outputDirectory string, raw bool, appstore bool, filter string) error { // create tmp directory in user tmp directory tmpDir := filepath.Join(os.TempDir(), "mxlint") @@ -67,7 +67,7 @@ func ExportModel(inputDirectory string, outputDirectory string, raw bool, mode s exportedCount := 0 if filter != "^Metadata$" { var err error - exportedCount, err = exportUnits(inputDirectory, tmpDir, raw, mode, filter) + exportedCount, err = exportUnits(inputDirectory, tmpDir, raw, filter) if err != nil { return fmt.Errorf("error exporting units: %v", err) } @@ -456,7 +456,7 @@ func validatePathLength(basePath string, relativePath string, filename string) ( return newRelativePath, filename, nil } -func getMxDocuments(units []MxUnit, folders []MxFolder, mode string) ([]MxDocument, error) { +func getMxDocuments(units []MxUnit, folders []MxFolder) ([]MxDocument, error) { var documents []MxDocument documentTypes := []string{"ProjectDocuments", "DomainModel", "ModuleSettings", "ModuleSecurity", "Documents"} @@ -476,7 +476,7 @@ func getMxDocuments(units []MxUnit, folders []MxFolder, mode string) ([]MxDocume } if unit.Contents["$Type"] == microflowDocumentType { - myDocument = enrichMicroflowDocument(myDocument, mode) + myDocument = enrichMicroflowDocument(myDocument) } documents = append(documents, myDocument) } @@ -485,7 +485,7 @@ func getMxDocuments(units []MxUnit, folders []MxFolder, mode string) ([]MxDocume return documents, nil } -func exportUnits(inputDirectory string, outputDirectory string, raw bool, mode string, filter string) (int, error) { +func exportUnits(inputDirectory string, outputDirectory string, raw bool, filter string) (int, error) { log.Debugf("Exporting units from %s to %s", inputDirectory, outputDirectory) units, err := getMxUnits(inputDirectory) @@ -497,7 +497,7 @@ func exportUnits(inputDirectory string, outputDirectory string, raw bool, mode s if err != nil { return 0, fmt.Errorf("error getting folders: %v", err) } - documents, err := getMxDocuments(units, folders, mode) + documents, err := getMxDocuments(units, folders) if err != nil { return 0, fmt.Errorf("error getting documents: %v", err) } diff --git a/mpr/mpr_test.go b/mpr/mpr_test.go index bca9930..977db95 100644 --- a/mpr/mpr_test.go +++ b/mpr/mpr_test.go @@ -698,28 +698,19 @@ func TestGetMxDocuments(t *testing.T) { name string units []MxUnit folders []MxFolder - mode string expectedDocs int }{ { - name: "basic mode", + name: "documents extracted", units: units, folders: folders, - mode: "basic", - expectedDocs: 2, - }, - { - name: "advanced mode", - units: units, - folders: folders, - mode: "advanced", expectedDocs: 2, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - documents, err := getMxDocuments(tt.units, tt.folders, tt.mode) + documents, err := getMxDocuments(tt.units, tt.folders) if err != nil { t.Errorf("getMxDocuments() unexpected error: %v", err) } diff --git a/mpr/mpr_v1_test.go b/mpr/mpr_v1_test.go index dbf5d72..77522ba 100644 --- a/mpr/mpr_v1_test.go +++ b/mpr/mpr_v1_test.go @@ -42,7 +42,7 @@ func TestMPRMetadata(t *testing.T) { func TestMPRUnits(t *testing.T) { t.Run("single-mpr", func(t *testing.T) { - if _, err := exportUnits("./../resources/app-mpr-v1", "./../tmp", false, "basic", ""); err != nil { + if _, err := exportUnits("./../resources/app-mpr-v1", "./../tmp", false, ""); err != nil { t.Errorf("Failed to export units from MPR file") } }) @@ -51,7 +51,7 @@ func TestMPRUnits(t *testing.T) { func TestIDAttributesExclusion(t *testing.T) { t.Run("verify-id-attributes-excluded", func(t *testing.T) { // Export units with ID attributes excluded - if _, err := exportUnits("./../resources/app-mpr-v1", "./../tmp", false, "basic", ""); err != nil { + if _, err := exportUnits("./../resources/app-mpr-v1", "./../tmp", false, ""); err != nil { t.Errorf("Failed to export units from MPR file: %v", err) return } @@ -108,7 +108,7 @@ func TestFilterMetadataOnly(t *testing.T) { // Export with filter ^Metadata$ // According to the code, when filter is "^Metadata$", only metadata is exported, no units - if err := ExportModel("./../resources/app-mpr-v1", testDir, false, "basic", false, "^Metadata$"); err != nil { + if err := ExportModel("./../resources/app-mpr-v1", testDir, false, false, "^Metadata$"); err != nil { t.Errorf("Failed to export with Metadata filter: %v", err) return } @@ -148,7 +148,7 @@ func TestFilterConstantPattern(t *testing.T) { // Export with filter ^Constant.* // This pattern won't match any documents in the test data, so we should get only metadata - if err := ExportModel("./../resources/app-mpr-v1", testDir, false, "basic", false, "^Constant.*"); err != nil { + if err := ExportModel("./../resources/app-mpr-v1", testDir, false, false, "^Constant.*"); err != nil { t.Errorf("Failed to export with Constant filter: %v", err) return } diff --git a/mpr/mpr_v2_test.go b/mpr/mpr_v2_test.go index 9df1694..8330b44 100644 --- a/mpr/mpr_v2_test.go +++ b/mpr/mpr_v2_test.go @@ -30,7 +30,7 @@ func TestMPRV2Metadata(t *testing.T) { t.Errorf("Failed to decode metadata file: %v", err) } // check metadata - expectedProductVersion := "10.18.3.58900" + expectedProductVersion := "10.24.9.81004" if metadataObj.ProductVersion != expectedProductVersion { t.Errorf("ProductVersion is incorrect. Expected: %s, Got: %s", expectedProductVersion, metadataObj.ProductVersion) } @@ -39,7 +39,7 @@ func TestMPRV2Metadata(t *testing.T) { func TestMPRV2Units(t *testing.T) { t.Run("single-mpr", func(t *testing.T) { - if _, err := exportUnits("./../resources/app-mpr-v2", "./../tmp", false, "basic", ""); err != nil { + if _, err := exportUnits("./../resources/app-mpr-v2", "./../tmp", false, ""); err != nil { t.Errorf("Failed to export units from MPR file") } }) diff --git a/serve/serve.go b/serve/serve.go index 85c21e5..22edffa 100644 --- a/serve/serve.go +++ b/serve/serve.go @@ -54,7 +54,6 @@ func runServe(cmd *cobra.Command, args []string) { inputDirectory := config.ProjectDirectory outputDirectory := config.Modelsource - mode := config.Export.Mode rulesDirectory := config.Rules.Path port := intValue(config.Serve.Port, 8082) verbose, _ := cmd.Flags().GetBool("verbose") @@ -95,7 +94,6 @@ func runServe(cmd *cobra.Command, args []string) { log.Infof("Watching for changes in %s", expandedPath) log.Infof("Output directory: %s", outputDirectory) log.Infof("Rules directory: %s", rulesDirectory) - log.Infof("Mode: %s", mode) log.Infof("Debounce time: %d ms", debounceTime) // Create a mutex to protect the cached results @@ -197,7 +195,7 @@ func runServe(cmd *cobra.Command, args []string) { }() log.Infof("Running export-model and lint") - err := mpr.ExportModel(inputDirectory, outputDirectory, false, mode, false, "") + err := mpr.ExportModel(inputDirectory, outputDirectory, false, false, "") if err != nil { log.Warningf("Export failed: %s", err) resultMutex.Lock() From d5f054fc407520c3e37f13c6746759323b6c9a27 Mon Sep 17 00:00:00 2001 From: Xiwen Cheng Date: Tue, 10 Mar 2026 15:39:12 +0100 Subject: [PATCH 5/7] Improve multi lines output --- mpr/mpr.go | 69 ++++++++++++++++++++++++++++++++++++++++++++++++- mpr/mpr_test.go | 9 +++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/mpr/mpr.go b/mpr/mpr.go index 9c2db21..16dfb97 100644 --- a/mpr/mpr.go +++ b/mpr/mpr.go @@ -574,7 +574,8 @@ func exportUnits(inputDirectory string, outputDirectory string, raw bool, filter func writeFile(filepath string, contents map[string]interface{}) error { log.Debugf("Writing file %s", filepath) - yamlstring, err := yaml.Marshal(contents) + normalizedContents := normalizeMultilineValues(contents) + yamlstring, err := yaml.Marshal(normalizedContents) if err != nil { return fmt.Errorf("error marshaling: %v", err) } @@ -585,6 +586,72 @@ func writeFile(filepath string, contents map[string]interface{}) error { return nil } +// normalizeMultilineValues normalizes indentation in multiline string values recursively +// so the YAML encoder does not emit invalid block scalar indentation indicators. +func normalizeMultilineValues(v interface{}) interface{} { + switch value := v.(type) { + case map[string]interface{}: + result := make(map[string]interface{}, len(value)) + for k, item := range value { + result[k] = normalizeMultilineValues(item) + } + return result + case []interface{}: + result := make([]interface{}, len(value)) + for i, item := range value { + result[i] = normalizeMultilineValues(item) + } + return result + case string: + return normalizeMultilineString(value) + default: + return v + } +} + +func normalizeMultilineString(value string) string { + if !strings.Contains(value, "\n") { + return value + } + + lines := strings.Split(value, "\n") + minIndent := -1 + for _, line := range lines { + if strings.TrimSpace(line) == "" { + continue + } + indent := countLeadingWhitespace(line) + if minIndent == -1 || indent < minIndent { + minIndent = indent + } + } + + if minIndent <= 0 { + return value + } + + for i, line := range lines { + if strings.TrimSpace(line) == "" { + continue + } + lines[i] = line[minIndent:] + } + + return strings.Join(lines, "\n") +} + +func countLeadingWhitespace(line string) int { + count := 0 + for _, r := range line { + if r == ' ' || r == '\t' { + count++ + continue + } + break + } + return count +} + func getMxUnits(inputDirectory string) ([]MxUnit, error) { mprPath, err := getMprPath(inputDirectory) if err != nil { diff --git a/mpr/mpr_test.go b/mpr/mpr_test.go index 977db95..68baace 100644 --- a/mpr/mpr_test.go +++ b/mpr/mpr_test.go @@ -506,6 +506,15 @@ func TestWriteFile(t *testing.T) { }, expectError: true, }, + { + name: "write multiline value with inconsistent indentation", + filepath: filepath.Join(tmpDir, "multiline.yaml"), + contents: map[string]interface{}{ + "Name": "TestDocument", + "Value": " if $x = 1 then empty\nelse if $x = 2 then true\n else false", + }, + expectError: false, + }, } for _, tt := range tests { From e1c13c7f28d9c353edab79cdf65a9928f5ea7a36 Mon Sep 17 00:00:00 2001 From: Xiwen Cheng Date: Tue, 10 Mar 2026 20:02:31 +0100 Subject: [PATCH 6/7] Support multiline scenarios --- lint/lint_javascript.go | 24 ++++-- lint/lint_test.go | 23 +++++- mpr/mpr.go | 70 +++++++++++++++++- mpr/mpr_test.go | 27 +++++++ resources/app-mpr-v2/App.mpr | Bin 73728 -> 73728 bytes ...943827a-0b44-45a8-9645-a670b9551756.mxunit | Bin 0 -> 4044 bytes 6 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 resources/app-mpr-v2/mprcontents/09/43/0943827a-0b44-45a8-9645-a670b9551756.mxunit diff --git a/lint/lint_javascript.go b/lint/lint_javascript.go index 179f20f..45386cb 100644 --- a/lint/lint_javascript.go +++ b/lint/lint_javascript.go @@ -195,15 +195,29 @@ func evalTestcase_Javascript(rulePath string, inputFilePath string, ruleNumber s } res, err := ruleFunction(sobek.Undefined(), vm.ToValue(data)) + + duration := time.Since(startTime) + var failure *Failure = nil + if err != nil { - panic(err) - } + errorMessage := fmt.Sprintf("Error evaluating javascript rule %v for inputfile %v: %v", rulePath, inputFilePath, err) + log.Error(errorMessage) - rs := res.Export().(map[string]interface{}) + failure = &Failure{ + Message: errorMessage, + Type: "RuntimeError", + } - duration := time.Since(startTime) + testcase := &Testcase{ + Name: inputFilePath, + Time: float64(duration.Nanoseconds()) / 1e9, // convert to seconds + Failure: failure, + Skipped: nil, + } + return testcase, nil + } - var failure *Failure = nil + rs := res.Export().(map[string]interface{}) log.Debugf("Result: %v", rs) result := rs["allow"].(bool) diff --git a/lint/lint_test.go b/lint/lint_test.go index d86b92e..d3e8087 100644 --- a/lint/lint_test.go +++ b/lint/lint_test.go @@ -539,9 +539,26 @@ function rule(input) { t.Fatalf("Failed to write yaml file: %v", err) } - _, err = EvalAllWithResults(tempDir, tempDir, "", "", false, false) - if err == nil { - t.Error("Expected error due to failures") + rule := Rule{ + Path: jsPath, + Pattern: ".*\\.yaml", + PackageName: jsPath, + RuleNumber: "099_0099", + Language: LanguageJavascript, + } + + result, err := evalTestsuite(rule, tempDir, false, false) + if err != nil { + t.Fatalf("Expected testsuite evaluation to succeed, got: %v", err) + } + if result.Failures != 1 { + t.Fatalf("Expected 1 failure, got %d", result.Failures) + } + if len(result.Testcases) != 1 || result.Testcases[0].Failure == nil { + t.Fatalf("Expected one failing testcase, got %+v", result.Testcases) + } + if !strings.Contains(result.Testcases[0].Failure.Message, "Always fails") { + t.Fatalf("Expected failure message to contain rule error, got: %s", result.Testcases[0].Failure.Message) } }) } diff --git a/mpr/mpr.go b/mpr/mpr.go index 16dfb97..c95b83a 100644 --- a/mpr/mpr.go +++ b/mpr/mpr.go @@ -12,6 +12,7 @@ import ( "strings" "gopkg.in/yaml.v3" + "go.mongodb.org/mongo-driver/bson" _ "github.com/glebarez/go-sqlite" ) @@ -586,16 +587,66 @@ func writeFile(filepath string, contents map[string]interface{}) error { return nil } +type doubleQuotedMultilineString string + +func (s doubleQuotedMultilineString) MarshalYAML() (interface{}, error) { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!str", + Value: string(s), + Style: yaml.DoubleQuotedStyle, + }, nil +} + +type literalBlockMultilineString string + +func (s literalBlockMultilineString) MarshalYAML() (interface{}, error) { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Tag: "!!str", + Value: string(s), + Style: yaml.LiteralStyle, + }, nil +} + // normalizeMultilineValues normalizes indentation in multiline string values recursively -// so the YAML encoder does not emit invalid block scalar indentation indicators. +// and forces multiline strings to be encoded as double-quoted scalars. func normalizeMultilineValues(v interface{}) interface{} { switch value := v.(type) { + case bson.M: + result := make(bson.M, len(value)) + for k, item := range value { + result[k] = normalizeMultilineValues(item) + } + return result case map[string]interface{}: result := make(map[string]interface{}, len(value)) for k, item := range value { result[k] = normalizeMultilineValues(item) } return result + case []bson.M: + result := make([]bson.M, len(value)) + for i, item := range value { + normalized := normalizeMultilineValues(item) + if itemMap, ok := normalized.(bson.M); ok { + result[i] = itemMap + } else { + result[i] = item + } + } + return result + case []map[string]interface{}: + result := make([]map[string]interface{}, len(value)) + for i, item := range value { + normalized := normalizeMultilineValues(item) + if itemMap, ok := normalized.(map[string]interface{}); ok { + result[i] = itemMap + } else { + result[i] = item + } + } + return result case []interface{}: result := make([]interface{}, len(value)) for i, item := range value { @@ -603,12 +654,27 @@ func normalizeMultilineValues(v interface{}) interface{} { } return result case string: - return normalizeMultilineString(value) + normalized := normalizeMultilineString(value) + if strings.Contains(normalized, "\n") { + if startsWithWhitespace(normalized) { + return doubleQuotedMultilineString(normalized) + } + return literalBlockMultilineString(normalized) + } + return normalized default: return v } } +func startsWithWhitespace(value string) bool { + if value == "" { + return false + } + first := value[0] + return first == ' ' || first == '\t' +} + func normalizeMultilineString(value string) string { if !strings.Contains(value, "\n") { return value diff --git a/mpr/mpr_test.go b/mpr/mpr_test.go index 68baace..083ab5e 100644 --- a/mpr/mpr_test.go +++ b/mpr/mpr_test.go @@ -7,6 +7,7 @@ import ( "testing" "gopkg.in/yaml.v3" + "go.mongodb.org/mongo-driver/bson" ) func TestGetMprVersion(t *testing.T) { @@ -515,6 +516,26 @@ func TestWriteFile(t *testing.T) { }, expectError: false, }, + { + name: "write multiline value without leading whitespace", + filepath: filepath.Join(tmpDir, "multiline_literal.yaml"), + contents: map[string]interface{}{ + "Name": "TestDocument", + "Value": "if $x = 1 then true\nelse false", + }, + expectError: false, + }, + { + name: "write nested bson multiline value with inconsistent indentation", + filepath: filepath.Join(tmpDir, "multiline_nested_bson.yaml"), + contents: map[string]interface{}{ + "Name": "TestDocument", + "Nested": bson.M{ + "Value": " if $x = 1 then empty\nelse if $x = 2 then true\n else false", + }, + }, + expectError: false, + }, } for _, tt := range tests { @@ -539,6 +560,12 @@ func TestWriteFile(t *testing.T) { if data["Name"] != tt.contents["Name"] { t.Errorf("Written file content mismatch") } + if (tt.name == "write multiline value with inconsistent indentation" || tt.name == "write nested bson multiline value with inconsistent indentation") && strings.Contains(string(content), "|") { + t.Errorf("Expected multiline value to be double-quoted, but found block scalar style in: %s", string(content)) + } + if tt.name == "write multiline value without leading whitespace" && !strings.Contains(string(content), "|\n") && !strings.Contains(string(content), "|-\n") { + t.Errorf("Expected multiline value to use literal block scalar style, got: %s", string(content)) + } } } }) diff --git a/resources/app-mpr-v2/App.mpr b/resources/app-mpr-v2/App.mpr index 737b919ba4adfc94b30146d5d86789079f4c406f..3e8e69560203f5c74fb7d40d223112fc9e8544c6 100644 GIT binary patch delta 231 zcmZoTz|wGlWr8%L*hCp;MzM_vHU27Tsc9)DNl6B}iDqdQx+cbH=DL9y~1^x z>#~BKq2ghT?VIIyJq?xP<(6dNU&!yo_n5DRPnGu=Zz?Y%&s-ie?(5tY+>#p`zjH~& zG_$ko=*V-V@}e6u{i8Iaq)tUuepYBec}Pj9XLh=$rAw|)YEf!#RGLwsaacyCxpt0+ UlZ%B?^v&>s z9IJK@fdWJ5cIL{nAG+mL91IJ101u%LLJs2&gbpPQ#tmf+0SuiCHVfAac(H+43%7V1 G0f+=m;54TI diff --git a/resources/app-mpr-v2/mprcontents/09/43/0943827a-0b44-45a8-9645-a670b9551756.mxunit b/resources/app-mpr-v2/mprcontents/09/43/0943827a-0b44-45a8-9645-a670b9551756.mxunit new file mode 100644 index 0000000000000000000000000000000000000000..7790c4ee1717f6982169fc5ae3d2c78d00291721 GIT binary patch literal 4044 zcmcInYitx%6uzBZaJyirAVolBC2I;Xz-~*+V*_^CUDz#cmvm{VCPt<+x81R`Gs`^M z-O?XEPy&QR3MdA7{2*9VL};pWE`W>AgbaRNo?fB zR@s^QiELgTzW79eQ6&irN+5w5RpCSdHdKm`GGD1{pCngz?BvDFR($-i~azhNO=q8MUuwOce8@t;h3nyO)tzMUSw0@E; zZUiw5losQJB0I@nWDO}emU78LTtbvzWYieMLF+M)Z?-^!;Z+v1APywrqNG&f7R;kZ zKo;a!77NHapBxMNeyA25*~;QZE5PHlPaE#NbaUTR6TI&p*|Y7~&YLeAK0N`tsTgHv z1TRyuz+kc;vifKl*U`M1J~#^0(MUg*6;9Axg!2$EL!1o>EKVRj3^1Ibvq z-z+~r@oIE)uyb3ib^TuVQCmpX4mwB+EDuV^QppJzy#aR8&PQ$!tq)#3Q@IDN-Ee&D z-fqMBG1<<~!)+Xve5%xf;UKeoR3wqF13yIx!5N_`?oy8nQDKQ|;sgjGLp%h;niP#p ziL)Zq@_=}!i?f1@-aEBAYQYao6Ngl~oBjR&O+gaZQPm!x9{@FGeB7?H3Q zNyYGQQ1B+J?l1ZAVyExT`TOs@_u{^ae!!xX&&%?Fuowxo<7U>r`gXWs@MFmV6|}kZZg(Bp~!m` z@fSWAEWR!e6mZ|=>+*oKukzIx3}VbxzP<6CZer21Ko{Yt)}i_YrI9U}1O&i)uyK7Yq+# zQ8R}?3#_80X0Kc;lO||Sv6nuU}t1 zk{Y2H;g13(KdsPYh3u>oIaXVXsA@Wf5s_A@yuy*Ll(K;=;f7bBo%lqa*SjBD3niAe z_1wKJr*9mt55HDWFm1}(b3J3svt+j%V@$8ztoj!jm1ec{Wmy54yNwZ0VYZQoLQ6`Z z1!f9F)nFc&zXbweq1kG!3)w*3?Q(gFUC>t|TpQLpWHI>wO{N%a%(7`tJj3SW*){_L zYgo)N&-CfVjM8G=3mrneF=>g?+piLIHH&!7rEB;#&g2)Fq+~dNNSx>3JbZLqo3jW# zMlnp1IR`K*J)m$xla?L%umC1XzJX?%`##o^nKMntI?LrLb0Ldn9_9{~)65rUg@U%W zlrBAAUcGzKt%EOo=Kk9V#c2*DF2V2#gO_PDG9wxibP(2XjSi$x-Uu#P1x9g(%Cn*>c_f`ee&8x51VgXOqjI8%P`21)fwAXQTvR z3HU)b09zqezl?QwHg-+?*%R&@xA08((%dCft;Fk>V=MfMU|M3Li)aZL1MY9BtE#q> SeTgVFliRqSg&_f&F!~odC$fqF literal 0 HcmV?d00001 From 20c795ca637c6f3b71f77e64e9276eab6c34ae60 Mon Sep 17 00:00:00 2001 From: Xiwen Cheng Date: Tue, 10 Mar 2026 20:09:42 +0100 Subject: [PATCH 7/7] Update model sources --- ...flowComplexSplit.Microflows$Microflow.yaml | 231 ++++++++++--- ...MicroflowForLoop.Microflows$Microflow.yaml | 133 ++++++-- .../MicroflowLoop.Microflows$Microflow.yaml | 170 +++++++--- ...roflowLoopNested.Microflows$Microflow.yaml | 304 ++++++++++++++---- .../MicroflowSimple.Microflows$Microflow.yaml | 71 ++-- .../MicroflowSplit.Microflows$Microflow.yaml | 144 ++++++--- ...owSplitThenMerge.Microflows$Microflow.yaml | 175 +++++++--- .../MyFirstLogic.Microflows$Microflow.yaml | 71 ++-- .../VA_Age.Microflows$Microflow.yaml | 109 +++++-- resources/modelsource-v2/Metadata.yaml | 4 +- ...oflowLoopExample.Microflows$Microflow.yaml | 191 +++++++++++ ...ltiLineMicroflow.Microflows$Microflow.yaml | 146 +++++++++ ...MicroflowExample.Microflows$Microflow.yaml | 177 ++++++++++ .../MyFirstLogic.Microflows$Microflow.yaml | 36 ++- .../Settings$ProjectSettings.yaml | 4 + .../Texts$SystemTextCollection.yaml | 88 +++-- resources/modelsource-v2/app.yaml | 9 + scripts/update-modelsources.sh | 13 +- 18 files changed, 1693 insertions(+), 383 deletions(-) create mode 100644 resources/modelsource-v2/Module2/MicroflowLoopExample.Microflows$Microflow.yaml create mode 100644 resources/modelsource-v2/Module2/MultiLineMicroflow.Microflows$Microflow.yaml create mode 100644 resources/modelsource-v2/Module2/SubMicroflowExample.Microflows$Microflow.yaml diff --git a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowComplexSplit.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowComplexSplit.Microflows$Microflow.yaml index b6065f9..ab8f000 100644 --- a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowComplexSplit.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowComplexSplit.Microflows$Microflow.yaml @@ -9,20 +9,22 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MicroflowComplexSplit -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: ByoAvHEnAECoob0TcBsoCQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CreateVariableAction ErrorHandlingType: Rollback InitialValue: MyFirstModule.EnumerationStatus._New @@ -30,43 +32,176 @@ ObjectCollection: VariableType: $Type: DataTypes$EnumerationType Enumeration: MyFirstModule.EnumerationStatus - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveSplit - Caption: Decision - Documentation: "" - ErrorHandlingType: Rollback - SplitCondition: + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: WRDtQdo6JUyYuOoGOduyKg== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: Decision + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: $Type: Microflows$ExpressionSplitCondition Expression: $status - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ExclusiveMerge - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: - $Type: Microflows$CreateChangeAction - Commit: "No" - Entity: MyFirstModule.Bike - ErrorHandlingType: Rollback - Items: [] - RefreshInClient: false - VariableName: NewBike - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: GtQF96dtV0G8gOv2X9ulQw== + $Type: Microflows$EnumerationCase + Value: Done + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ExclusiveMerge + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: 4lsobhDlDEmu00iffEjksA== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: mTqnRBztSU+tw1feVZstJw== + $Type: Microflows$EnumerationCase + Value: InProgress + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-15 + OriginControlVector: -2;14 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: ofqfAAZ6W0Oi4BaPJNdYfg== + $Type: Microflows$EnumerationCase + Value: (empty) + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-30 + OriginControlVector: 0;15 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$CreateChangeAction + Commit: "No" + Entity: MyFirstModule.Bike + ErrorHandlingType: Rollback + Items: [] + RefreshInClient: false + VariableName: NewBike + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: zcwSb1ri20aIsWKv+U6d9Q== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-15 + OriginControlVector: 0;30 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: eafhO9mN/ka+Uu6v154wUw== + $Type: Microflows$EnumerationCase + Value: Cancelled + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;15 + OriginControlVector: 0;15 + - Attributes: + $Type: Microflows$ExclusiveMerge + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: nbqcFg2i+Eu2YAO95CVRwQ== + $Type: Microflows$EnumerationCase + Value: _New + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 15;0 + OriginControlVector: 0;15 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowComplexSplit ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MicroflowComplexSplit + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + status = MyFirstModule.EnumerationStatus._New + + IF $status THEN + GOTO L001 // case: Done + // OR GOTO L002 // case: InProgress + // OR GOTO L003 // case: (empty) + // OR GOTO L001 // case: Cancelled + // OR GOTO L004 // case: _New + END IF + + LABEL L001 + + + LABEL L002 + + LABEL L003 + // action: Microflows$CreateChangeAction + + + LABEL L004 + + END diff --git a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowForLoop.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowForLoop.Microflows$Microflow.yaml index 476794d..d0511bb 100644 --- a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowForLoop.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowForLoop.Microflows$Microflow.yaml @@ -9,20 +9,22 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MicroflowForLoop -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: mNbOo7XmhE22WCcjlxz4Zw== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$RetrieveAction ErrorHandlingType: Rollback ResultVariableName: BikeList @@ -36,31 +38,46 @@ ObjectCollection: $Type: Microflows$ConstantRange SingleObject: false XpathConstraint: "" - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$LoopedActivity - Documentation: "" - ErrorHandlingType: Rollback - LoopSource: + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: oSElvrlmJkGpoeUrbtZjKw== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$LoopedActivity + Documentation: "" + ErrorHandlingType: Rollback + LoopSource: $Type: Microflows$IterableList ListVariableName: BikeList VariableName: IteratorBike - ObjectCollection: + ObjectCollection: $Type: Microflows$MicroflowObjectCollection Objects: - - $Type: Microflows$ActionActivity + - $ID: REoQzbooxUqlJfxtM61uuw== + $Type: Microflows$ActionActivity Action: + $ID: ePBJZv2ockmxBjt1gRJInw== $Type: Microflows$ChangeAction ChangeVariableName: IteratorBike Commit: "No" ErrorHandlingType: Rollback Items: - - $Type: Microflows$ChangeActionItem + - $ID: vlZ2qLGLHkaufP+Kexafqg== + $Type: Microflows$ChangeActionItem Association: "" Attribute: MyFirstModule.Bike.Name + Type: Set Value: '''abc''' RefreshInClient: false AutoGenerateCaption: true @@ -68,19 +85,69 @@ ObjectCollection: Caption: Activity Disabled: false Documentation: "" - - $Type: Microflows$ActionActivity - Action: + RelativeMiddlePoint: 184;120 + Size: 120;60 + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: fn8Jgb25I0yZH/iZubEH3w== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CommitAction CommitVariableName: BikeList ErrorHandlingType: Rollback RefreshInClient: false WithEvents: true - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: 5k1lHmjvtUWTjcbw91JXYQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowForLoop ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MicroflowForLoop + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + BikeList = retrieve from database MyFirstModule.Bike + + FOR EACH IteratorBike IN BikeList + IteratorBike.Name = 'abc' + END FOR + + // action: Microflows$CommitAction + + + END diff --git a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoop.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoop.Microflows$Microflow.yaml index 4cc1f9c..e083e06 100644 --- a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoop.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoop.Microflows$Microflow.yaml @@ -9,55 +9,145 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MicroflowLoop -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: GiH0TK39nUWNx49qCaO+7Q== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CreateVariableAction ErrorHandlingType: Rollback InitialValue: "10" VariableName: counter VariableType: $Type: DataTypes$IntegerType - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveSplit - Caption: Enough? - Documentation: "" - ErrorHandlingType: Rollback - SplitCondition: + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: ssykl6pqyUqJCuOggJOUtQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ExclusiveMerge + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: NwmcF32mSUug4t2CDPQghQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: Enough? + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: $Type: Microflows$ExpressionSplitCondition Expression: $counter > 0 - - $Type: Microflows$ActionActivity - Action: - $Type: Microflows$ChangeVariableAction - ChangeVariableName: counter - ErrorHandlingType: Rollback - Value: $counter-1 - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveMerge - - $Type: Microflows$Annotation - Caption: 'label: label1' - - $Type: Microflows$Annotation - Caption: 'goto: label1' + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: X8BX7EbNHEKxzAzXbV9PVw== + $Type: Microflows$EnumerationCase + Value: "true" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: ujmRZNU150qvnlAUoqPLJA== + $Type: Microflows$EnumerationCase + Value: "false" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;30 + OriginControlVector: 0;-15 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$ChangeVariableAction + ChangeVariableName: counter + ErrorHandlingType: Rollback + Value: $counter-1 + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: n6vcUe3E4EWUB7u+Zoe2/Q== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-15 + OriginControlVector: -30;0 + - Attributes: + $Type: Microflows$ExclusiveMerge +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowLoop ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MicroflowLoop + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + counter = 10 + + LABEL L001 + + IF $counter > 0 THEN + GOTO L002 + ELSE + GOTO L003 + END IF + + LABEL L002 + + LABEL L003 + counter = $counter-1 + GOTO L001 + + END diff --git a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoopNested.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoopNested.Microflows$Microflow.yaml index 926032f..a7bd63b 100644 --- a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoopNested.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowLoopNested.Microflows$Microflow.yaml @@ -9,83 +9,251 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MicroflowLoopNested -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: pns0UIqrRUWOihSp3xfF0g== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CreateVariableAction ErrorHandlingType: Rollback InitialValue: "10" VariableName: counter VariableType: $Type: DataTypes$IntegerType - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveSplit - Caption: Enough? - Documentation: "" - ErrorHandlingType: Rollback - SplitCondition: + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: UKaIBh0q5EG61Fd5Hb1V1w== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ExclusiveMerge + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: 5D4FtjfHaU2hqHvOhHuW/g== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: Enough? + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: $Type: Microflows$ExpressionSplitCondition Expression: $counter > 0 - - $Type: Microflows$ActionActivity - Action: - $Type: Microflows$ChangeVariableAction - ChangeVariableName: counter - ErrorHandlingType: Rollback - Value: $counter-1 - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveMerge - - $Type: Microflows$ExclusiveSplit - Caption: more? - Documentation: "" - ErrorHandlingType: Rollback - SplitCondition: - $Type: Microflows$ExpressionSplitCondition - Expression: $counter2 > 0 - - $Type: Microflows$ActionActivity - Action: - $Type: Microflows$CreateVariableAction - ErrorHandlingType: Rollback - InitialValue: "20" - VariableName: counter2 - VariableType: - $Type: DataTypes$IntegerType - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ActionActivity - Action: - $Type: Microflows$ChangeVariableAction - ChangeVariableName: counter2 - ErrorHandlingType: Rollback - Value: $counter2-1 - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveMerge + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: +iET+CRW00Gp3hNjUtwu5g== + $Type: Microflows$EnumerationCase + Value: "true" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: QEeT4yPDzk6a3czfYVVGrg== + $Type: Microflows$EnumerationCase + Value: "false" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;30 + OriginControlVector: 0;-15 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$CreateVariableAction + ErrorHandlingType: Rollback + InitialValue: "20" + VariableName: counter2 + VariableType: + $Type: DataTypes$IntegerType + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: nD1AKthUmEq3h50QOXyQZQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;15 + OriginControlVector: 0;-30 + - Attributes: + $Type: Microflows$ExclusiveMerge + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: Cwi0Y+E+cEKMwOh2n+/ehA== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;15 + OriginControlVector: 0;-15 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: more? + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: + $Type: Microflows$ExpressionSplitCondition + Expression: $counter2 > 0 + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: 57Dpwr4rtECju/dbpm0UcA== + $Type: Microflows$EnumerationCase + Value: "false" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 30;0 + OriginControlVector: -15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$ChangeVariableAction + ChangeVariableName: counter + ErrorHandlingType: Rollback + Value: $counter-1 + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: kOOW1HJnm06lCraExHD1AQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-15 + OriginControlVector: 0;30 + - Attributes: + $Type: Microflows$ExclusiveMerge + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: GJUIOCVuFkyxppsqr8/Lbw== + $Type: Microflows$EnumerationCase + Value: "true" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-30 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$ChangeVariableAction + ChangeVariableName: counter2 + ErrorHandlingType: Rollback + Value: $counter2-1 + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: dc3qO8PZ1EKIClotmzP5Tg== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 15;0 + OriginControlVector: 0;30 + - Attributes: + $Type: Microflows$ExclusiveMerge +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowLoopNested ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MicroflowLoopNested + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + counter = 10 + + LABEL L001 + + IF $counter > 0 THEN + GOTO L002 + ELSE + GOTO L003 + END IF + + LABEL L002 + + LABEL L003 + counter2 = 20 + + LABEL L004 + + IF $counter2 > 0 THEN + GOTO L006 + ELSE + GOTO L005 + END IF + + LABEL L005 + counter = $counter-1 + GOTO L001 + + LABEL L006 + counter2 = $counter2-1 + GOTO L004 + + END diff --git a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSimple.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSimple.Microflows$Microflow.yaml index b7cdc79..b46d017 100644 --- a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSimple.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSimple.Microflows$Microflow.yaml @@ -9,32 +9,65 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MicroflowSimple -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: 3aYgrUdk2kes8OgRwAn/2w== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CreateVariableAction ErrorHandlingType: Rollback InitialValue: "false" VariableName: Variable VariableType: $Type: DataTypes$BooleanType - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: qTDWISziZ025rDj2XnQbSA== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowSimple ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MicroflowSimple + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + Variable = false + + + END diff --git a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplit.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplit.Microflows$Microflow.yaml index 4a0f122..af3824c 100644 --- a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplit.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplit.Microflows$Microflow.yaml @@ -9,58 +9,116 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MicroflowSplit -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: gus6TaZ+7EqtgIf2bAnl2g== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CreateVariableAction ErrorHandlingType: Rollback InitialValue: '''test'' ' VariableName: Variable VariableType: $Type: DataTypes$StringType - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveSplit - Caption: empty? - Documentation: "" - ErrorHandlingType: Rollback - SplitCondition: + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: ZNXIj10BZUmfZB6SrZGZaA== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: empty? + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: $Type: Microflows$ExpressionSplitCondition Expression: $Variable != empty and $Variable != '' - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: - $Type: Microflows$LogMessageAction - ErrorHandlingType: Rollback - IncludeLatestStackTrace: false - Level: Info - MessageTemplate: - $Type: Microflows$StringTemplate - Parameters: [] - Text: test - Node: '''XXX''' - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: 5pQc0Ffffk6oRS0KWA0uWg== + $Type: Microflows$EnumerationCase + Value: "false" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: fxaQkhvbpUq3X9IcxtTEow== + $Type: Microflows$EnumerationCase + Value: "true" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-30 + OriginControlVector: 0;15 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$LogMessageAction + ErrorHandlingType: Rollback + IncludeLatestStackTrace: false + Level: Info + MessageTemplate: + $Type: Microflows$StringTemplate + Parameters: [] + Text: test + Node: '''XXX''' + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: dpl6eUL5SUaChpbo+ZkS1g== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-15 + OriginControlVector: 0;30 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowSplit ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: "MICROFLOW: MicroflowSplit\nRETURN TYPE: void\n\nPSEUDOCODE\n----------\nBEGIN\n\n Variable = 'test' \n\n IF $Variable != empty and $Variable != '' THEN\n GOTO L002\n ELSE\n GOTO L001\n END IF\n\n LABEL L001\n\n LABEL L002\n log info: \"test\"\n\n\nEND" diff --git a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplitThenMerge.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplitThenMerge.Microflows$Microflow.yaml index 82dd309..eb2f088 100644 --- a/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplitThenMerge.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/Folder/MicroflowSplitThenMerge.Microflows$Microflow.yaml @@ -9,56 +9,149 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MicroflowSplitThenMerge -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: svSfk27rQUOrFsOuNKD7DA== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CreateVariableAction ErrorHandlingType: Rollback InitialValue: "false" VariableName: Variable VariableType: $Type: DataTypes$BooleanType - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveSplit - Caption: left or right? - Documentation: "" - ErrorHandlingType: Rollback - SplitCondition: + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: vA0rbX3mvEezhz7u1QUK6g== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: left or right? + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: $Type: Microflows$ExpressionSplitCondition Expression: $Variable - - $Type: Microflows$ActionActivity - Action: - $Type: Microflows$LogMessageAction - ErrorHandlingType: Rollback - IncludeLatestStackTrace: false - Level: Info - MessageTemplate: - $Type: Microflows$StringTemplate - Parameters: [] - Text: test - Node: '''XXX''' - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ExclusiveMerge + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: aN4Nm1Ztw0e8gDQvOw2mTQ== + $Type: Microflows$EnumerationCase + Value: "false" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ExclusiveMerge + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: xUuozi7+DkaKHOnHCW2EZQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: Jd4hAUJwpE6gt6868Ytiqw== + $Type: Microflows$EnumerationCase + Value: "true" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-30 + OriginControlVector: 0;15 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$LogMessageAction + ErrorHandlingType: Rollback + IncludeLatestStackTrace: false + Level: Info + MessageTemplate: + $Type: Microflows$StringTemplate + Parameters: [] + Text: test + Node: '''XXX''' + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: +2Dc4CHizkOnL9xyPXkCRA== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;15 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ExclusiveMerge +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowSplitThenMerge ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MicroflowSplitThenMerge + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + Variable = false + + IF $Variable THEN + GOTO L002 + ELSE + GOTO L001 + END IF + + LABEL L001 + + + LABEL L002 + log info: "test" + GOTO L001 + + END diff --git a/resources/modelsource-v1/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml index f3d8b86..5a424c1 100644 --- a/resources/modelsource-v1/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml @@ -12,22 +12,22 @@ ConcurrenyErrorMessage: Documentation: '#noqa' Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$VoidType -Name: MyFirstLogic -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$Annotation - Caption: "Microflows are used to define server logic in your app.\r\n\r\n- For client logic you can use Nanoflows\r\n- For business process logic you can use Workflows\r\n\r\nDocumentation: https://docs.mendix.com/refguide/application-logic" - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: D3Po1QicOkyhuybPVJjvAQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$RetrieveAction ErrorHandlingType: Rollback ResultVariableName: SessionList @@ -35,12 +35,41 @@ ObjectCollection: $Type: Microflows$AssociationRetrieveSource AssociationId: System.Session_User StartVariableName: currentUser - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MyFirstLogic ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MyFirstLogic + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + SessionList = retrieve from database + + + END diff --git a/resources/modelsource-v1/MyFirstModule/VA_Age.Microflows$Microflow.yaml b/resources/modelsource-v1/MyFirstModule/VA_Age.Microflows$Microflow.yaml index 7439591..2fdc3f1 100644 --- a/resources/modelsource-v1/MyFirstModule/VA_Age.Microflows$Microflow.yaml +++ b/resources/modelsource-v1/MyFirstModule/VA_Age.Microflows$Microflow.yaml @@ -9,42 +9,46 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden -MarkAsUsed: false -MicroflowActionInfo: null -MicroflowReturnType: - $Type: DataTypes$IntegerType -Name: VA_Age -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: $Variable - $Bike/Year - - $Type: Microflows$MicroflowParameter - DefaultValue: "" - Documentation: "" - HasVariableNameBeenChanged: false - IsRequired: true - Name: Bike - VariableType: - $Type: DataTypes$ObjectType - Entity: MyFirstModule.Bike - - $Type: Microflows$ActionActivity - Action: +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: Zd8wxeDn2UG3o0H3iJTjqg== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$CreateVariableAction ErrorHandlingType: Rollback InitialValue: "2024" VariableName: Variable VariableType: $Type: DataTypes$IntegerType - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" - - $Type: Microflows$ActionActivity - Action: + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: wkvhJt34KU2JSNqkhjNmeQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: $Type: Microflows$RetrieveAction ErrorHandlingType: Rollback ResultVariableName: PhotoList @@ -58,12 +62,47 @@ ObjectCollection: $Type: Microflows$ConstantRange SingleObject: false XpathConstraint: "" - AutoGenerateCaption: true - BackgroundColor: Default - Caption: Activity - Disabled: false - Documentation: "" + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: eTq+WKyueUuvBhP3PGvxdQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: $Variable - $Bike/Year +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$IntegerType +Name: VA_Age ReturnVariableName: Variable Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: VA_Age + RETURN TYPE: integer + PARAMETERS: + - Bike: MyFirstModule.Bike (required) + + PSEUDOCODE + ---------- + BEGIN + + Variable = 2024 + + PhotoList = retrieve from database MyFirstModule.Photo + + + END diff --git a/resources/modelsource-v2/Metadata.yaml b/resources/modelsource-v2/Metadata.yaml index 99033d2..0a22dcf 100644 --- a/resources/modelsource-v2/Metadata.yaml +++ b/resources/modelsource-v2/Metadata.yaml @@ -1,5 +1,5 @@ -ProductVersion: 10.18.3.58900 -BuildVersion: 10.18.3.58900 +ProductVersion: 10.24.9.81004 +BuildVersion: 10.24.9.81004 Modules: - Name: Atlas_Web_Content ID: GMyJGqJY0U2f8EzUDi71Dg== diff --git a/resources/modelsource-v2/Module2/MicroflowLoopExample.Microflows$Microflow.yaml b/resources/modelsource-v2/Module2/MicroflowLoopExample.Microflows$Microflow.yaml new file mode 100644 index 0000000..cead6df --- /dev/null +++ b/resources/modelsource-v2/Module2/MicroflowLoopExample.Microflows$Microflow.yaml @@ -0,0 +1,191 @@ +$Type: Microflows$Microflow +AllowConcurrentExecution: true +AllowedModuleRoles: [] +ApplyEntityAccess: false +ConcurrencyErrorMicroflow: "" +ConcurrenyErrorMessage: + $Type: Texts$Text + Items: + - $Type: Texts$Translation + LanguageCode: en_US + Text: "" +Documentation: "" +Excluded: false +ExportLevel: Hidden +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$RetrieveAction + ErrorHandlingType: Rollback + ResultVariableName: UserList + RetrieveSource: + $Type: Microflows$DatabaseRetrieveSource + Entity: System.User + NewSortings: + $Type: Microflows$SortingsList + Sortings: [] + Range: + $Type: Microflows$ConstantRange + SingleObject: false + XpathConstraint: "" + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$LoopedActivity + Documentation: "" + ErrorHandlingType: Rollback + LoopSource: + $Type: Microflows$IterableList + ListVariableName: UserList + VariableName: IteratorUser + ObjectCollection: + $Type: Microflows$MicroflowObjectCollection + Objects: + - $ID: g/PgRp//CUStmibDmOJGUQ== + $Type: Microflows$ExclusiveSplit + Caption: Blocked? + Documentation: "" + ErrorHandlingType: Rollback + RelativeMiddlePoint: 423;230 + Size: 90;60 + SplitCondition: + $ID: x671Oc5lIUqVaYCRFRq33Q== + $Type: Microflows$ExpressionSplitCondition + Expression: $IteratorUser/Blocked + - $ID: qvJvj4trREyhrd0EFQZqAA== + $Type: Microflows$ActionActivity + Action: + $ID: 0wFuJMG8Z0ODTTj4cFqdaw== + $Type: Microflows$ChangeAction + ChangeVariableName: IteratorUser + Commit: "Yes" + ErrorHandlingType: Rollback + Items: + - $ID: 3ndmYkpAQEG56GUahxkUVQ== + $Type: Microflows$ChangeActionItem + Association: "" + Attribute: System.User.Blocked + Type: Set + Value: "false" + RefreshInClient: false + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + RelativeMiddlePoint: 556;216 + Size: 120;60 + - $ID: FxQfVn3+6UalNzCY6BlRGQ== + $Type: Microflows$ActionActivity + Action: + $ID: BsJx2U6qc0mMSYhVzohrVA== + $Type: Microflows$LogMessageAction + ErrorHandlingType: Rollback + IncludeLatestStackTrace: false + Level: Info + MessageTemplate: + $ID: pPxO50LYuECvCnIPPyLU8w== + $Type: Microflows$StringTemplate + Parameters: + - $ID: QmUmW9/5wkGUIEBKeJFeIw== + $Type: Microflows$TemplateParameter + Expression: $IteratorUser/Name + Text: User {1} not blocked + Node: '''Module2''' + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + RelativeMiddlePoint: 89;259 + Size: 120;60 + - $ID: VbyRMrCfdECSP4TpmH3wJg== + $Type: Microflows$ActionActivity + Action: + $ID: ZZKOWEUdDUqCkmWvTkKvTg== + $Type: Microflows$MicroflowCallAction + ErrorHandlingType: Rollback + MicroflowCall: + $ID: CkMwoLD0zkeY4/gzHvyLIQ== + $Type: Microflows$MicroflowCall + Microflow: Module2.SubMicroflowExample + ParameterMappings: + - $ID: z1Oi4YYudUWjQw+shw//Og== + $Type: Microflows$MicroflowCallParameterMapping + Argument: $IteratorUser + Parameter: Module2.SubMicroflowExample.User + QueueSettings: null + ResultVariableName: "" + UseReturnVariable: true + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + RelativeMiddlePoint: 242;101 + Size: 120;60 + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MicroflowLoopExample +ReturnVariableName: "" +Url: "" +UrlSearchParameters: [] +WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MicroflowLoopExample + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + UserList = retrieve from database System.User + + FOR EACH IteratorUser IN UserList + IF $IteratorUser/Blocked THEN + IteratorUser.Blocked = false + commit IteratorUser + call Module2.SubMicroflowExample(User = $IteratorUser) + ELSE + log info: "User {1} not blocked" + END IF + END FOR + + + END diff --git a/resources/modelsource-v2/Module2/MultiLineMicroflow.Microflows$Microflow.yaml b/resources/modelsource-v2/Module2/MultiLineMicroflow.Microflows$Microflow.yaml new file mode 100644 index 0000000..3e2f37f --- /dev/null +++ b/resources/modelsource-v2/Module2/MultiLineMicroflow.Microflows$Microflow.yaml @@ -0,0 +1,146 @@ +$Type: Microflows$Microflow +AllowConcurrentExecution: true +AllowedModuleRoles: [] +ApplyEntityAccess: false +ConcurrencyErrorMicroflow: "" +ConcurrenyErrorMessage: + $Type: Texts$Text + Items: [] +Documentation: "" +Excluded: false +ExportLevel: Hidden +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: hello + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: + $Type: Microflows$ExpressionSplitCondition + Expression: |- + if $currentUser/Name = 'Hello' then + true + else if $currentUser/Active then + true + else if $currentUser/Blocked then + false + else if $currentUser/FailedLogins > 0 then + false + + else + false + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: kFLcqSkTTE2SbZHeWHs7RA== + $Type: Microflows$EnumerationCase + Value: "true" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$ChangeAction + ChangeVariableName: currentUser + Commit: "No" + ErrorHandlingType: Rollback + Items: + - $ID: pP7PeHh36UGf5MurbcmkNw== + $Type: Microflows$ChangeActionItem + Association: "" + Attribute: System.User.Name + Type: Set + Value: " if $currentUser/Name = 'a' then\n'b'\nelse if $currentUser/Name = 'b' then\n'c'\nelse\n$currentUser/Name\n" + RefreshInClient: false + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: Pp0aNAtKQEGJxbZFmKrXcw== + $Type: Microflows$EnumerationCase + Value: "false" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-15 + OriginControlVector: 0;15 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: MultiLineMicroflow +ReturnVariableName: "" +Url: "" +UrlSearchParameters: [] +WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MultiLineMicroflow + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + IF if $currentUser/Name = 'Hello' then + true + else if $currentUser/Active then + true + else if $currentUser/Blocked then + false + else if $currentUser/FailedLogins > 0 then + false + + else + false THEN + GOTO L001 + ELSE + GOTO L002 + END IF + + LABEL L001 + currentUser.Name = if $currentUser/Name = 'a' then + 'b' + else if $currentUser/Name = 'b' then + 'c' + else + $currentUser/Name + + + + LABEL L002 + + END diff --git a/resources/modelsource-v2/Module2/SubMicroflowExample.Microflows$Microflow.yaml b/resources/modelsource-v2/Module2/SubMicroflowExample.Microflows$Microflow.yaml new file mode 100644 index 0000000..b9b15c3 --- /dev/null +++ b/resources/modelsource-v2/Module2/SubMicroflowExample.Microflows$Microflow.yaml @@ -0,0 +1,177 @@ +$Type: Microflows$Microflow +AllowConcurrentExecution: true +AllowedModuleRoles: [] +ApplyEntityAccess: false +ConcurrencyErrorMicroflow: "" +ConcurrenyErrorMessage: + $Type: Texts$Text + Items: [] +Documentation: "" +Excluded: false +ExportLevel: Hidden +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$LogMessageAction + ErrorHandlingType: Rollback + IncludeLatestStackTrace: false + Level: Info + MessageTemplate: + $Type: Microflows$StringTemplate + Parameters: + - $ID: fzpeCz9EJ0euoHen2mxcIQ== + $Type: Microflows$TemplateParameter + Expression: $User/Name + Text: Hello {1} + Node: '''Example''' + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -30;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$CreateVariableAction + ErrorHandlingType: Rollback + InitialValue: "10" + VariableName: counter + VariableType: + $Type: DataTypes$IntegerType + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 30;0 + - Attributes: + $Type: Microflows$ExclusiveMerge + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$ExclusiveSplit + Caption: more than 0? + Documentation: "" + ErrorHandlingType: Rollback + SplitCondition: + $Type: Microflows$ExpressionSplitCondition + Expression: $counter > 0 + Splits: + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: ckJSVPWxw0CZrqKfFsuO5A== + $Type: Microflows$EnumerationCase + Value: "false" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 15;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" + - - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: JTA1JyHlTkOWjStmhI0qGg== + $Type: Microflows$EnumerationCase + Value: "true" + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;-30 + OriginControlVector: 0;15 + - Attributes: + $Type: Microflows$ActionActivity + Action: + $Type: Microflows$ChangeVariableAction + ChangeVariableName: counter + ErrorHandlingType: Rollback + Value: $counter - 1 + AutoGenerateCaption: true + BackgroundColor: Default + Caption: Activity + Disabled: false + Documentation: "" + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: [] + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: 0;15 + OriginControlVector: -30;0 + - Attributes: + $Type: Microflows$ExclusiveMerge +MarkAsUsed: false +MicroflowActionInfo: null +MicroflowReturnType: + $Type: DataTypes$VoidType +Name: SubMicroflowExample +ReturnVariableName: "" +Url: "" +UrlSearchParameters: [] +WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: SubMicroflowExample + RETURN TYPE: void + PARAMETERS: + - User: System.User (required) + + PSEUDOCODE + ---------- + BEGIN + + log info: "Hello {1}" + + counter = 10 + + LABEL L001 + + IF $counter > 0 THEN + GOTO L003 + ELSE + GOTO L002 + END IF + + LABEL L002 + + LABEL L003 + counter = $counter - 1 + GOTO L001 + + END diff --git a/resources/modelsource-v2/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml b/resources/modelsource-v2/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml index 39a214c..882a57e 100644 --- a/resources/modelsource-v2/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml +++ b/resources/modelsource-v2/MyFirstModule/MyFirstLogic.Microflows$Microflow.yaml @@ -9,21 +9,39 @@ ConcurrenyErrorMessage: Documentation: "" Excluded: false ExportLevel: Hidden +MainFunction: + - Attributes: + $Type: Microflows$StartEvent + - Attributes: + $Type: Microflows$SequenceFlow + CaseValues: + - $ID: D3Po1QicOkyhuybPVJjvAQ== + $Type: Microflows$NoCase + IsErrorHandler: false + Line: + $Type: Microflows$BezierCurve + DestinationControlVector: -15;0 + OriginControlVector: 0;0 + - Attributes: + $Type: Microflows$EndEvent + Documentation: "" + ReturnValue: "" MarkAsUsed: false MicroflowActionInfo: null MicroflowReturnType: $Type: DataTypes$VoidType Name: MyFirstLogic -ObjectCollection: - $Type: Microflows$MicroflowObjectCollection - Objects: - - $Type: Microflows$StartEvent - - $Type: Microflows$EndEvent - Documentation: "" - ReturnValue: "" - - $Type: Microflows$Annotation - Caption: "Microflows are used to define server logic in your app.\r\n\r\n- For client logic you can use Nanoflows\r\n- For business process logic you can use Workflows\r\n\r\nDocumentation: https://docs.mendix.com/refguide/application-logic" ReturnVariableName: "" Url: "" UrlSearchParameters: [] WorkflowActionInfo: null +pseudocode: |- + MICROFLOW: MyFirstLogic + RETURN TYPE: void + + PSEUDOCODE + ---------- + BEGIN + + + END diff --git a/resources/modelsource-v2/Settings$ProjectSettings.yaml b/resources/modelsource-v2/Settings$ProjectSettings.yaml index da42051..0a3b89e 100644 --- a/resources/modelsource-v2/Settings$ProjectSettings.yaml +++ b/resources/modelsource-v2/Settings$ProjectSettings.yaml @@ -8,6 +8,7 @@ Settings: UrlPrefix: p UseOptimizedClient: "No" - $Type: Settings$IntegrationProjectSettingsPart + ObsoleteEnableUrlEncoding: false - $Type: Settings$ConfigurationSettings Configurations: - $Type: Settings$ServerConfiguration @@ -27,6 +28,7 @@ Settings: OpenAdminPort: true OpenHttpPort: false ServerPortNumber: 8090 + Tracing: null - $Type: Settings$ModelSettings AfterStartupMicroflow: "" AllowUserMultipleSessions: true @@ -40,11 +42,13 @@ Settings: JavaVersion: Java21 RoundingMode: HalfUp ScheduledEventTimeZoneCode: Etc/UTC + SslCertificateAlgorithm: SunX509 UseDatabaseForeignKeyConstraints: true UseOQLVersion2: false UseSystemContextForBackgroundTasks: false - $Type: Settings$ConventionSettings ActionActivityDefaultColors: [] + DefaultAssociationStorage: Table DefaultSequenceFlowLineType: BezierCurve LowerCaseMicroflowVariables: false - $Type: Settings$LanguageSettings diff --git a/resources/modelsource-v2/Texts$SystemTextCollection.yaml b/resources/modelsource-v2/Texts$SystemTextCollection.yaml index 236181b..f46df55 100644 --- a/resources/modelsource-v2/Texts$SystemTextCollection.yaml +++ b/resources/modelsource-v2/Texts$SystemTextCollection.yaml @@ -1089,17 +1089,6 @@ SystemTexts: - $Type: Texts$Translation LanguageCode: en_US Text: You can’t complete this user task, it is not assigned to you. - - $Type: Texts$SystemText - InternalKey: mendix.platform.workflows.cant_complete_task_generic - Text: - $Type: Texts$Text - Items: - - $Type: Texts$Translation - LanguageCode: nl_NL - Text: Je kunt deze taak niet afronden, de taak is wellicht al afgerond, is niet langer geldig of the workflow is al verder gegaan. - - $Type: Texts$Translation - LanguageCode: en_US - Text: You can’t complete this user task, it may be already completed, invalid, or the workflow might have moved on. - $Type: Texts$SystemText InternalKey: mendix.platform.workflows.cant_lock_workflow_definition_locked Text: @@ -1177,17 +1166,6 @@ SystemTexts: - $Type: Texts$Translation LanguageCode: nl_NL Text: Jezelf verwijderen is niet mogelijk. - - $Type: Texts$SystemText - InternalKey: mendix.platform.creating_object_failed_because_of_security - Text: - $Type: Texts$Text - Items: - - $Type: Texts$Translation - LanguageCode: en_US - Text: Creating object of type {1} failed for security reasons. - - $Type: Texts$Translation - LanguageCode: nl_NL - Text: Een object creëren met type {1} is gefaald om veiligheidsredenen. - $Type: Texts$SystemText InternalKey: mendix.platform.deleting_object_failed_because_of_security Text: @@ -1254,3 +1232,69 @@ SystemTexts: - $Type: Texts$Translation LanguageCode: nl_NL Text: Kan de Jump-To opties niet genereren voor deze workflow instantie, omdat de huidige state het niet toestaat. + - $Type: Texts$SystemText + InternalKey: mxui.sys.UI.page_not_found + Text: + $Type: Texts$Text + Items: + - $Type: Texts$Translation + LanguageCode: en_US + Text: The page you requested was not found. You are redirected to the home page. + - $Type: Texts$Translation + LanguageCode: nl_NL + Text: Deze pagina kon niet gevonden worden. U word doorverwezen naar de home page + - $Type: Texts$SystemText + InternalKey: mendix.platform.workflows.cant_complete_task_outcome_already_set_by_you + Text: + $Type: Texts$Text + Items: + - $Type: Texts$Translation + LanguageCode: en_US + Text: You can't complete this user task because an outcome has already been set for this user. + - $Type: Texts$Translation + LanguageCode: nl_NL + Text: Je kunt deze taak niet afronden, want er is al een uitkomst gezet voor deze gebruiker. + - $Type: Texts$SystemText + InternalKey: mendix.platform.workflows.cant_complete_task_already_completed + Text: + $Type: Texts$Text + Items: + - $Type: Texts$Translation + LanguageCode: en_US + Text: You can't complete this user task because it is already completed. + - $Type: Texts$Translation + LanguageCode: nl_NL + Text: Je kunt deze taak niet afronden, want deze is al afgerond. + - $Type: Texts$SystemText + InternalKey: mendix.platform.workflows.cant_complete_task_not_in_progress + Text: + $Type: Texts$Text + Items: + - $Type: Texts$Translation + LanguageCode: en_US + Text: You can't complete this user task because it is not in progress. + - $Type: Texts$Translation + LanguageCode: nl_NL + Text: Je kunt deze taak niet afronden, want deze is niet actief. + - $Type: Texts$SystemText + InternalKey: mendix.platform.workflows.cant_complete_task_workflow_not_in_progress + Text: + $Type: Texts$Text + Items: + - $Type: Texts$Translation + LanguageCode: en_US + Text: You can't complete this user task because the workflow instance containing it is not in progress. + - $Type: Texts$Translation + LanguageCode: nl_NL + Text: Je kunt deze taak niet afronden, want de workflow waar deze onderdeel van is is niet actief. + - $Type: Texts$SystemText + InternalKey: mendix.platform.workflows.cant_complete_task_internal_error + Text: + $Type: Texts$Text + Items: + - $Type: Texts$Translation + LanguageCode: en_US + Text: You can’t complete this user task because there is an internal issue with it. Please contact your System Administrator. + - $Type: Texts$Translation + LanguageCode: nl_NL + Text: Je kunt deze taak niet afronden, want er is een interne fout opgetreden. Neem contact op met de applicatiebeheerder. diff --git a/resources/modelsource-v2/app.yaml b/resources/modelsource-v2/app.yaml index b42f73f..b4bca09 100644 --- a/resources/modelsource-v2/app.yaml +++ b/resources/modelsource-v2/app.yaml @@ -34,12 +34,21 @@ content: - name: Constant_3.Constants$Constant.yaml type: file path: Module2/Folder_testverylongl_TRUNCATED_70781_longlong name/Folder testverylongl_TRUNCATED_82413_glonglonglong/Constant_3.Constants$Constant.yaml + - name: MicroflowLoopExample.Microflows$Microflow.yaml + type: file + path: Module2/MicroflowLoopExample.Microflows$Microflow.yaml + - name: MultiLineMicroflow.Microflows$Microflow.yaml + type: file + path: Module2/MultiLineMicroflow.Microflows$Microflow.yaml - name: Projects$ModuleSettings.yaml type: file path: Module2/Projects$ModuleSettings.yaml - name: Security$ModuleSecurity.yaml type: file path: Module2/Security$ModuleSecurity.yaml + - name: SubMicroflowExample.Microflows$Microflow.yaml + type: file + path: Module2/SubMicroflowExample.Microflows$Microflow.yaml - name: _ type: directory path: Module2/_ diff --git a/scripts/update-modelsources.sh b/scripts/update-modelsources.sh index 6b90f09..897a2b1 100755 --- a/scripts/update-modelsources.sh +++ b/scripts/update-modelsources.sh @@ -1,5 +1,14 @@ #!/bin/sh # # -./bin/mxlint-darwin-arm64 export-model -i resources/app-mpr-v1 -o resources/modelsource-v1 -./bin/mxlint-darwin-arm64 export-model -i resources/app-mpr-v2 -o resources/modelsource-v2 +echo " +modelsource: resources/modelsource-v1 +projectDirectory: resources/app-mpr-v1 +" > /tmp/mxlint-dev.yaml +./bin/mxlint-darwin-arm64 export-model --config /tmp/mxlint-dev.yaml + +echo " +modelsource: resources/modelsource-v2 +projectDirectory: resources/app-mpr-v2 +" > /tmp/mxlint-dev.yaml +./bin/mxlint-darwin-arm64 export-model --config /tmp/mxlint-dev.yaml