From 9a84e517deb18a74cb9291a7f597952f848ee71b Mon Sep 17 00:00:00 2001 From: Claus Jonathan Fritzemeier <clausjonathan.fritzemeier@hhu.de> Date: Fri, 13 May 2016 15:49:38 +0200 Subject: [PATCH] changes to modelorg for version 2.0 --- R/addReact.R | 4 +--- R/geneDel.R | 14 +++++++++----- R/modelorgClass.R | 5 +++-- R/rmReact.R | 6 ++---- R/validmodelorg.R | 11 ++++------- data/Ec_core.RData | Bin 6640 -> 6338 bytes 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/R/addReact.R b/R/addReact.R index c99b64c..31a8c66 100644 --- a/R/addReact.R +++ b/R/addReact.R @@ -54,9 +54,7 @@ addReact <- function(model, stop("needs an object of class modelorg!") } - if(!.hasSlot(model, "version")){ - validObject(model) - } + stopifnot(checkVersion(model)) if (length(met) != length(Scoef)) { stop("arguments 'met' and 'Scoef' must have the same length") diff --git a/R/geneDel.R b/R/geneDel.R index 874bb63..87811bb 100644 --- a/R/geneDel.R +++ b/R/geneDel.R @@ -41,9 +41,7 @@ geneDel <- function(model, genes, checkId = FALSE) { stop("needs an object of class modelorg!") } - if(!.hasSlot(model, "version")){ - validObject(model) - } + stopifnot(checkVersion(model)) if (isTRUE(checkId)) { if (is(genes, "character")) { @@ -99,9 +97,10 @@ geneDel <- function(model, genes, checkId = FALSE) { #print(reactInd) #x <- logical(length(allGenes(model))) - x <- rep(TRUE, length(allGenes(model))) + xAll <- rep(TRUE, length(allGenes(model))) #print(x) - x[geneInd] <- FALSE + xAll[geneInd] <- FALSE + names(xAll) <- allGenes(model) constReact <- logical(length(reactInd)) #print(constReact) @@ -112,10 +111,15 @@ geneDel <- function(model, genes, checkId = FALSE) { # If that's the case, the reaction needs gene bla. ru <- gprRules(model)[reactInd] + ge <- genes(model)[reactInd] for(i in 1:length(reactInd)) { #print(reactInd[i]) #print(ru[i]) #ev <- eval(parse(text = ru[i])) + + #define x for eval: + x <- xAll[ge[[i]]] + ev <- tryCatch(eval(parse(text = ru[i])), error = function(e) e) if (is(ev, "simpleError")) { stop("wrong gene association:", diff --git a/R/modelorgClass.R b/R/modelorgClass.R index 8f8343a..d44d548 100644 --- a/R/modelorgClass.R +++ b/R/modelorgClass.R @@ -604,6 +604,7 @@ setMethod("optimizeProb", signature(object = "modelorg"), prCmd = NA, poCmd = NA, prCil = NA, poCil = NA, ...) { + stopifnot(checkVersion(object)) if (!is.null(gene)) { if (!is.null(react)) { @@ -1097,13 +1098,13 @@ setMethod("singletonMetabolites", signature(object = "modelorg"), setMethod("checkVersion", signature(object = "modelorg"), function(object) { if(!.hasSlot(object, "version")){ - stop("No version slot found. Please use upgradeModelorg on object") + return("No version slot found. Please use upgradeModelorg with object") } if(compareVersion(version(object), SYBIL_SETTINGS("MODELORG_VERSION")) == 0){ return(TRUE) } - stop(paste0("modelorg has version ", object(version), ", but you need at least version ", version)) + return(paste0("modelorg has version ", version(object), ", but you need at least version ", version)) } ) diff --git a/R/rmReact.R b/R/rmReact.R index 6e13204..45ab6ed 100644 --- a/R/rmReact.R +++ b/R/rmReact.R @@ -42,10 +42,8 @@ rmReact <- function(model, react, rm_met = TRUE) { stop("needs an object of class modelorg!") } - if(!.hasSlot(model, "version")){ - validObject(model) - } - + stopifnot(checkVersion(model)) + # check this, propably working wrong if (is.na(match(is(react)[1], c("reactId", "numeric", "integer", "character")))) { stop("argument react must be numeric, character, or of class reactId. Use checkReactId!") diff --git a/R/validmodelorg.R b/R/validmodelorg.R index 0be1796..2aaee84 100644 --- a/R/validmodelorg.R +++ b/R/validmodelorg.R @@ -38,13 +38,10 @@ return("needs an object of class modelorg!") } - if(compareVersion(version(object), SYBIL_SETTINGS("MODELORG_VERSION")) != 0){ - if(compareVersion(version(object), SYBIL_SETTINGS("MODELORG_VERSION")) == -1){ - return("You are using an old version of the modelorg-Class. Use upgradeModelorg to get a compatible object!") - } - if(compareVersion(version(object), SYBIL_SETTINGS("MODELORG_VERSION")) == 1){ - return("You are using a new version of the modelorg-Class. Plase upgrade your sybil package!") - } + versionCheck <- checkVersion(object) + + if(!isTRUE(versionCheck)){ + return(versionCheck) } if ((length(mod_id(object)) != 1) || (length(mod_name(object)) != 1)) { diff --git a/data/Ec_core.RData b/data/Ec_core.RData index 4030d203e277531c772fa49364dc271910625cde..ebf33613cc778356128bc432ac0ee3f02d95b12f 100644 GIT binary patch literal 6338 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 literal 6640 zcmb2|=3oE==C`)dIWpHvH!t~d;qsN!o1U~Eo2aX=o4dz)^Z6rwJCrnoL^X3&v^G9I zai+jh#XRcWn(v8|Gv)m5y5CXry|lzL-m~%B;uHSznT<*sQ7bjNL>%pfwm4jvZ{})0 zsb5T&OGNj=ftQxX-|tjEJEt>!%FAPpE)O!^?d&f;Z~OdC@%cG7C1Yn-UAy)Djoo1b zww}h{3~UQ`q%-{Ul&J36TOd1gonF}9Y1t}l{#m|@U*G%mXw&U=PL(}Z`*((}kNfPd z>m<Hi&V1d&HM@W9c)9jC@8cb}KJmHtK3Ea`ZkgSht=Dw6-bq`1HKS^6^w~bM9DBai zRj+-QUlnv_ce(uFNm8ij-4iu==^HP`wm)**f6E|EnY&T1NO7~uw4S|pVrutQO|FVm zJoD^^$G)9Wyo*a)`7Ey*JQ6Z`6*BkNrYsSQ{Pk6RS@&Ou>^=5KW%kLHWwUy;(=A)> zMqM=sPkg;_o}$*(sP^P}OB3}DOOz|0&gN5poF-}ZsBDj^Y-mf^r<x~T8Isy@-iL4O z2%DaKxAdN{!PRY9#j{q|?7Miis<g1Hvv%vfh&kL_mCxPY9aTMjJOBD?<~L%pr!7z1 z^juDDlC6)N^41A_Zm;=_Ry^)nSh`#;N#lU1GjDt3O^$@@#3|g&f!A#AM4Zl=vBdg_ zZ?Z;;<h;W=$va+dl5Cr`)nJjEsrk-Tg2BamBT{VkN5ni1yLrm+S9SE=n91GQJ7OP9 zyYVh;wUyTLo81{1=W{)>cHMV5zvz#eW#8qpRhyn|ot+(*rL{Hc{+eC7`J3lu{VMf4 zE_&C`XKC6Ww-sKI6Q4Z})LLUGpY^6GJfL^^=cXB1UxH?a=&`z8{wQ@NcS%gCb=H(N zxephAZQ8wU=bq5Jc59li`c|a|7H^2kUVh3Tvv;Dj@ZB$=eAAX|Evh)-6?^wX!~MR) zVN&td5%bocc*G>?u9hu(FZ0tXQQdd5zuY<2Zhrl)h+$3EDmLz{O6l2r2AoV?!B<PN zH*dc7=~kYWbf(<QcWW$p*UR<av!A-_#;c|$i8*#g-yE;aYW%h|%G&AQqU%xbJKqJf zoY2!RyS{Tn$)70()(cNek=<%*;=5sXMBn#QZdS9NZ&>tr&2_2UD}$yat@_58zo5hF z@}o7Srcpj;UbWUvzZGY?q&}g9Pp7WC>*CHUdxGEh+E*<N`)Xx+<FV<4$(!GpCD^Wf z8nrlj?d}T-<p(S7_pO|^`_9^3r;`rs{Ks6f^R~6bqO)dEaq;bcIUECQ>=eq|wPbhf zdU(ZF{fS5)*Yd|rrOo;8_8m!yzIfJUy~NrU_ZL4JrM<U`@7~ImcR(qU<LcGatD4LC zLJn?@U9G#Y@tIQ7uKW3~uRV_Tk1L<P*L3?$PAic`-)d#~8lsZByO<qaPrN?3<b2+> z#gmW8NJ<=)ax}5ZW)aMk;mNoj_ttu?^b5!6^|x2$s{c89cK=n2wYn<%Yc=+lt=$-P z+*$nn<h1z4`ge}`9lNhb?o;2J+oZO4udX<sz}vDS!+pW0Yfo}4*^}{Q+m{x>KQB}3 zOn>#<=k562{n$7E^;P|KvGVfn#n#2&9$Dw@dFSZH{Pe``zplG>YxqxlzAR(%50CbD zr%z3u9=+=6tEsH&ExMXQva40uePhp^Xgh5jyt(MiQ^~8jJ8aA?Q*%!^a!;+ixhY`h zyrp&gF)J!x`|aL)Vw1MM{<$eDzsqqHblz_~`P$^;lVWc1j6mh!?&1@QtihMVHD*Z7 zjN4(gx<YDhUD?HzYIh5*T54quxrS~PU!AwMO?%b6rCQ${S?@h+-+f^3?y!rmvPAEG zEnvMft3C4L`=ei1>8+P))XGiT@sf}KWB!7}q5o`)D<tl`S;aMlJ6`G0*{BKz7uQ6| z2X~jOlH60Va7|aqeWQ|(uS{2p%deamr5`t2>%@-#w|di->wYc&cx+G3PQ&{f#a5=K zsKw8m6*|o#c%8@Lc{69TNNq}ecdGPi(b337Hn%RExzoGS_v+hYqSp#)gL`)_Jd;-N zjLUa3J5%YVV-LM22XCIe>GIN(mP)4Prn@!V&rE;bF;!4w^HZL4r}r9L*v}1gePvLy z)W&r7$;%lB#MYhlIuxF^`N*jSx0IVjUAGi{+@y8x<fAjHp&_zq5$u!x2Rs!Lc3x`a zS?nCxyC!D(RqoWQzb#)G##FwOQZ8O=w6^QWsTW_RCr|b<J8YLHEZ^XJHRAHsO>>GD z+JsMgdQ;PTn!bKYL?l-&<FhMC`i0+Cwy^&^x8(3Are*b+m8<g(XYO8hzwLXmz?O@8 z6((2Y&v|aYx=#0Mtnj;gQg4@CSJIUg+AjZWt(1`P)=YH|J%z8P%lA$CB)PhhcXQ1> z5lx26&lN-Ox5SyOy<2>z_4Be_)jiU`L=1(FulX5t)^N7&dgdv&X20(FZ@9<%bAH-k z?Fx-KS2((RmTd`=dw;q3*@r31=T=>f{`_i})ExzNNA4;CKk?$bD^0B~+*_ekx#N7+ z&ewU(8n%tGw`TK7bg+c&$@5;bDYr@9{Gr|17Co1bJr)bktoD{Ka$KXo^V!in<q7Xk zZ#_3_CEx1yhZ};r3!?uSP0QBSzH9bH?dC+Q4%Wc`-(IC1U%hVYp3>`I%(70OxN~XK z%r~p7kCx96EA+ZEckZXn@gDioRniBgW0r9#?wOkvpK`^gd@<MK@YJ%_<rlvk6P}fs zah5%xB<k*r6Xve3To-w)w_j!CR&_biOY|kLd&(vEe9L1&wzjvEG~Ug(6_1pWkv0_W zp5xmR?sd&YN@KU+Oe3w`%0}LT3!Pqeo)DPHcOhCXa-omh`A0JsWaas)KdM@pmhGC6 ztIf?^oL@F4dIPi6SKmz^FMm}2+FP2^TJlD{^Tw5JCfx?Dr%Im6D)4UJR3Q7uVP9rb z@WC9D;+KmV13h2OF<G*9dg9E@pF$!;*^UMEZJcMg^OkYF<n8}GCz|rN>KWY#%{;a5 zcHzttx!K+;uNf@-)av=-{<|Gh0;*F&XYGB~u4pw;uh{-#@Z>o`%u`<<H4O3*KH_Ho zaNhHGS~p9gx2i=vw7OX7Vxv64pFb(}yF%W{wQpaR_{z?W)+y_myW!tWuiJ^IRL;vB zKT!Mnpxkx8#=?zXx97$lXPLXhvd<xUZ5CTUYt6dMD;GVwWBj=m`_&$dop#9N{H$$t zJhIJ>jOPRO<ceyxKg|&pnEPps-K`z-KW*BmZL2j!ZpVTEpG9nwq#s6ARha&=Ilyvs z{qCI0^CzgO&I@Z@Ja6)+ol`0_L~Z(SW&Np|o_nBYR%JT-$Cqg)xw&C;uTA>D#PL#n zNq64E54!6Xr!6?{DnH*=kXd{2w8e)S*RHvD^VgYa9_6!jKIh!h+#bpO^7+Crl~lQl z4}Wg6xw~!e_H##jKkiys=(jjHS!aHz^A_EZ?3G6^v-EF|JT$j5&6rc#sP)^azD3QA zC$>6^o5gK1x|jW)H92pmtex7nPa(@goh6TX8r1ABQP>gBmAYCy-mvbA<=Ocm9p_o} z?q5C|&0um@W!>>V`*Z`1|17Ca;$5fA@UN5WgNg&&0imyp8Jrn@GxA9|u46K-kx<Y) zRbi|Di<evKxy%3GM<jec$O{$={Ow-!Pe8i4c;1B{3o0is`Zw3G^tsF5hKSRQj@3SA zD(x9K4jM4Zv05;Hu#omIzR3{TAauZ*<!m~`siyynoBky_PCqu?B#w*WJ==_gQq6|# z(vEtznlBzl$tTpdwVvVc+_~YcVnaKlAM+mG2Zjxs7yaL{U?$rMW)a4DY!%`MOb!$_ z1Sj29ceT{K_I1Gm-(ul^9FJ?gda5Hn{O-wcm-6rYl<Ah-KjHmkpJ{C~=AZsKchUXZ z60w&wU$Xsv-m_uf`Hru}(H1LSPI`7$GST+AOT6FwUv_#aUat?xcgrQd6=&%!biVni z^4h<a1It-@MWVIW^?ti9+;e{UjT(PW*&y3q-Oio!F1-kpJ^P<$vFl%t_FcJ)WiEtW zaO-X|ugx#2op9IY<h73rUK9tt5d6<}L*oDOZ8>YdsLXnQb@|afHT)OnDO<Tm*!~oH zb^iPEdVY<H$B$RaPv@U@U$w+4nWg$SQ?|RT-|+{(_ARi?@LS_N|5)wWl%6;b{$(?& zgFYNQu2^TI(JotlnS<v;v(t+w1}ARHCAJhK&l6<w?(D4RO5l4Sbzn1tyg^g@svq9z zH51z1e{dbpVvysj2&mzBAm$*;F#nnvgAK!zr>+fR4$=(uzIRv;v~SgCu90|<%wW&_ zVKc*gmLDPq(i!adKV&n+GyafmSkLrF@xXkhKavOHnf{m_FlYQH_TV-{J^u%OhW{)d z^cn86|1fX(&+<dQL7ric-n`JJ7@-6K&Iz7Ob4r<7W-`oFIZz<1Fr6jm2aARpqnGD_ zHjjphDhD)#7TjTxaAp#j$q=c!jzNc^VU3VJgAU^w7WQ-x!{%VqstLVUH@kgF{H9TI zaEg7`s}(Q4S1}~Y=1crzoDi}5uYBXA`?~A?7VO;@Uu|Er{IPn^kB`<%_XpdRN6VGW zmEc`he$2$`|KIoV|Ds-9sD3Z==YD_fxAyp|oTPu%`|IBv{%>P#xNYb6YuD|+ZnSRc z{&xGm<=5NwA1~eibMo!_xwTJEPrvv1)m!WJa+x(RFHgOFzh>Fb-S=;PKl3*K?wYzw ze-FvuvHTUjzWzb+{e4QuyI;>`me<)Iw&PDP=PtX-jBmg9fB*3PUB~OU@--iC&9|Rx zU-NtS{;!|%@2vVWQO5kw)${NFzq9{$_ig>(U-h=%kKh0GBJbvLS?3e(G5Pi7>5uQP z_;>%+b@S}{ciaBvPw(%1p!BtF`{(^P|2@z9d1IaIyKhycKi^H8Q?_gUyRdh=bI+H| z<<PsmZTs%4_x*lfv~+lWXm+lAd3L*X?EAdOySK`}zs6Utb(}M~`fu5)e)C=OC3Al4 zNzS?ZKJWSdXxnd-v-RuBPse}Bx_&=C=HPM_-LCy#pDoO~o9X=cfW+!MyZ2aGzAuT| z$~!mW^2&QfVPDN{+gBFnWZ1`ikBiHCP%EZZA@;sTZNde=^<S1>_n&c}<Iz63zhCy( zeX0KX{(JfJjcbqZ53JjE+I{`M{F1%5mwtEqd0%t>?ycu`Z|#12ne%;D-sY2KM_D32 z?|r@Zwf}`sfALCh`KUEjdTEdU)F$pZS^w(Fp6})F->>~5eouV$*=t+#?)oq8lYF)O zGW%rd^XYlB<PFW|ZO^-;FYztMCjav7=f@W~o4uI8tyg)IpIyA^)T3)t+ZM$ro#Izt z=&e?J+2s7Jh*Kvfm0n)b=-l8H_s%_y)p+KdbEaoM{!9`2{WPD+bcfgx(HV_Q+om*0 zY3r_&EZlnJ>OM<5zAg7HrY@MkS`=t_!u256S{cRkf*^07EYZAQH4ZB^vb?&k1&Yk? zee|1y>+HFfmb7T|t(Ny+T^HWqcbjiY7Psnc%awP3Z?M!~#r^Qrq7`~ySKIX-(-D~_ z%5|EnH8uC<Th2GrM6X&Fih7;o@;;&U_#3Zfw36?WC4NPTbD!ue`z&ML5HoE;sY%0} z8OGwq=?Mb2AL_l(%oJT@yJJg{Q<SBu?iG(X4{iM=Q^SAr{y2Bq^+#>%wNFnpJ}K5d zIeO-2Qin_D$%PZto(NP4KAe$rZ~uYThzXw`v#=W0J4W{I_vES!@>qBwTCr8h-6Gue z<W;RRK_ZhhxOQvadZZN+B*LW6HC5#3rtTzu@z%#0oF}KT?47hAJm|D7=jEw?ToWBH z=sunLD8MV}^c1d*?{05D8#FN{d!@?UoT$!66%RU>-c7r7rr^H(j>}sT^e3wwpXQl< z^2C;~y?V=EotVFjJ4^I%hxg0h5uM4Bn*W16l$FmYH9vO=2vD+q^L>G_(qf&1>Qne9 z>b4l1bZ}Ut;?Ypge{owznReAD7TKIv6ZT4q8SJPOGT8Ma!dWFKy(XyS)r9}&BMwy< zl|?D%t$utt?fLTaLOZYa%;kO0vqdveqVldx&e64d@4AVoSfty!w%A`^{zs7QNpjn- zifb2wZk;<R9y;A2OHz4`j8xY0%bBZWrr73QSm&a%dP=xS*Ug|3u?q&Xmrl4}*54A+ zd+d6URrCqBA52DFQ%eqVDYkO(YKQB%WZtmcHYaD{j;S>r>-Tz@uv(v=$mHH7bF$#b zqmHu^b=-?&G`}XOg;jFub!}O3XR(%d&ccQ%5#`7HrG8$Vnm(1QXMN4BKCWE>FOI*l z{qwFMb%)pr-<w$r6O36SEuF8=>Ydt>qI<jRi^ud!r+%!-$^30QB{tRg%t3~v!XwW( zZeA7mtU429pXSEOoyMoqPLyk$O!*{fw?6gbv=?j}i^B|qW@<iLld*Ku>%enN$<pUO z>ss7>7-U@8eIvC?N9@uW_o+!SQHGNrddyPHtWAEj>Qmr!{u+&qOE<f26$r?>qJBf{ zHJ`^7^_0u468&?wCH3_$`lSC+k9U#4-y;V&jRIG*`%Sr;`X<Th5_6m3Y(3Y$MRMN~ zqYZTqd=wO2KlSWn6TVH(TP8gBXjFFXGdR4xE3+@f0_1X!Y07^j^o#hq<}@p<o!-i@ z)aJh1O97|X(j2ROXZq*OZe){r5!v^|LWo!SjnMsI*6tq?&*V-&;+X8y*Lm&P=Ub}J z4l{KAYRrkUidgo1lIYfs5=HsD^UF@yALLn6t#_==+sCqOo5<a02c=^<n+?^Amrdx~ zReCx}y>seWQDxf$(rGgfRUgatF*P$@zh-XVFT>SGQs%MVbqN=^TVW#Dox&B?rYz=O zp(6Zv>w--uCa%zLI(wSOXl|dN@BY0E+*^MdPUyc}P{Y42(L!vCe91bqXg7<)7Sp~c z*Idq?S@%UNzxqd=&CD;4EB6Z@`{bD4@%Xr;XvcZhsZRUi_by~<aja^vnPu|VHhY#| z@=cS!FXl|;el<;p<FsnNL_d45gN|Gz=h?5OJA%I@=g(gvUvWC9@Q(hkw~~?BCnxE8 zM@F9N?SCAz+c!kad*YrY@01O__yuC5jy*q^z;llI-k%FGA%{#RJu(z9J@!QHo6+Bn zIo{h9{@&@gdb{JUb_65a_Qp?&8+d(0ABCrNN}T)kRpL|;cdLNu3;u_h`+psuTz5d~ zgvjF1$W5u5+WWaDeL1{s0b{aRq!z0x&-WD1cYT)^$nto!mKn&1y7IWqTvU^PTt@G+ zmRIZgrrd-Bn$OxYjLY5~h$}miXV7x7?S}C-<#48!MM>S$xIPstd)hOIwsBolpL%I& z;kG3<pWP*Lew7$p;NftZu=0~uU4`a1A(xV_9{CV2@8bzUnlg(#RG#J=n-#X*UH@Bg zu}tH}Bm>JMoi)XY9U3KVj7j=)e=07VqkdZ1oQIM5$zxCZZ^EBi&T4wQMk=v7?os!a zjNFuRa@x{0I!{wP&jn5?7U@3n%h}U@k#HH4yM(4~t}*NHO~PF#kIq*+bUuA){_(}G zQ>ShSm>{u!;>W`eb#BLT#K;vk7S1Y|E3tIq_sh4odhtATQDrMwB(!LIVV>R_xf}i0 zoeF1J$$vg1XK2BFjlWUSxQ6HCpDLc?Gc2b>=$-7}?^HNlDv$Gh+d(nq?!>T!#-A@f zcKzmU(mFVO)5`;Yy}6HiXx($_yzto5K4a13Bb!n@=jmmAmi7NtF>&r))ydvWOiLV` z1Y|xs?hEX6l&n)>{d21%CUM8+wcBneWL#N!J>BJ0G0y|jr58O`8GpO;cJi$$SClwU z&zP}1-^obr(M>JJpZ{k?_i(zDO;Zc`?d8vZtVOBza=6#?s#{(g7ppH$*)FTHaLTs# zMn6?{=guv;by0JFXwb>?oSs<|V<t>Fcg=FajN%>n=iKKOSFKxqzfk7f%P%&~k1v_7 znLTaU&5Ij<Cr>C06x*M=%=KlvWaaxko+hq`zMa=w;x?sjTj7>(zO@=mRi~PLZ~gD+ z_0HU2yL_pU%2tn4P8%05*P5~YPT99c#i(nIl53{r2FSdSWLowh=*jC|X<i$V=X3jh zZ8@}2Uh3fO`SFHV?#C%tNQ=I1?5deu(ZIM@(>J_kq4@r$g20%U+C0^~U#At@ADGX5 zZ~4I)41bCa3iC{AtJ?h6v&?om<G#D|ZXPo|`rxhGhh<-@dB3(*w>74&Fki&^g15A3 zk6>N2>{E~YI(yv*l8j%<%=TW~8$3hggU#+s(RVqFnbN8cs47<+{IyANPl~UB{sXQ9 zp$%LIs##)$Hz+)4Ye+Y(@H_CE^+ES-^P68=5AgL*mi@O#@Xx}(3v(y(J`}h9)@_#} z{w0;WX0q&ktK;G)UY-_7xc~3=|1YH+e}s-GyL~9ynYm)U#f9mTFTA-@qVLSR;C4ap z$90|^=eV8re+k>a?tJF5c8kj6CnZv==bjYH{aEX>?7etZTG5yJZ|VgOFh&@?d-t@W z#?bEF(ux|>l*=4(eg88X`Wb4jaKugdzeBL*&{JWz510O|cKh(?&w0i_HV5=24tjrC zFWFdEf083^#eb6n`qBrxzs_g<A#-58#6j<G@eDsg8}ylKPIAQU`d`{`pXJA<hrhMA z%>I2ckL}2>c<xvJ3AJZ#zv55$yDwqS$F%yuzjAk)B^<16JileK{8%afO26RhVf_Nz z4(5t>yZoH3yS=ZQ-!^2o{VO-$&a#DF&}!*-4z`cQ9*f(4@d#Q)7PY<L_*ig8qLEqU zcze65m1Rl9lNA~U2OJpq%SskhFf1x|VQ*t(wk$1q@gn1;fwOx1Io|zzMK=QcEORy7 zz5GOEGmdh|JmWt0PM+h%myZnY>AvS?$fs0Dd^mskf}%kp3p;~lnazafTMxf$xNvmC zLOajH_D4%1PkgCOT6a{=FTb9Dx%sp0tYU>Bb!W@&y|wU;+k0(U{#3gS4)@<!=lkWC zMEPA^dwq9l`#zUC3Hz0?t7kpU%Dp+~&YEjazsszD^nChXecSH;;wzrkzlg5uo;1n( zU%kcCtLC@2ehdB=-Xgv3`G2*wZt;uc=knEieor}?`$K+F==|qvE#_{WKG*l+!x_KU z6{I*GKh3*5vOGGDeaEu=n#(@v`lfrXt-9Q>%scMzl<e=DgL*=K?0NCszT!@^eE57x kMdMfhmoH6Fwq3!q)qHwZsq2x7zyBFzz1-exEoEQ;0Ix9e&;S4c -- GitLab