From 701d8b348e2e529e9352d546fab246815e1d7a9a Mon Sep 17 00:00:00 2001 From: Gareth Parker Date: Wed, 1 Sep 2021 12:49:06 +0100 Subject: [PATCH] feat(ignore): support disable directives in source code (#3072) Add support `// Stryker disable` and `// Stryker restore` directives in source code. Some examples: ```js // Stryker disable all const foo = 2 + 40; // mutants here are ignored // Stryker restore all // Stryker disable BooleanLiteral const foo = true || false; // => BooleanLiteral mutant is ignored, but other mutants are tested. // Stryker restore all // Stryker disable next-line all const foo = true || false; // => ignored mutants const bar = true || false; // => mutants // Stryker disable next-line all: I don't care about this piece of code const foo = bar || baz; // ignored mutants with reason "I don't care about this piece of code" ``` Ignored mutants _do end up in your mutation report_, but are not placed or tested and they don't count towards your mutation score. ![image](https://user-images.githubusercontent.com/1828233/131149477-cf91ce19-9d87-4005-8af5-68e2a4b920c8.png) --- docs/configuration.md | 2 +- docs/disable-mutants.md | 181 ++++++++ docs/images/disable-mutants-disable-all.png | Bin 0 -> 43744 bytes ...able-mutants-disable-equality-operator.png | Bin 0 -> 45488 bytes .../disable-mutants-equivalent-mutant.png | Bin 0 -> 41778 bytes e2e/helpers.ts | 4 +- e2e/test/ignore-project/src/Add.js | 31 +- e2e/test/ignore-project/stryker.conf.json | 1 + e2e/test/ignore-project/verify/verify.ts | 54 ++- packages/instrumenter/.vscode/launch.json | 2 +- .../src/transformers/babel-transformer.ts | 13 +- .../src/transformers/directive-bookkeeper.ts | 92 +++++ .../test/integration/instrumenter.it.spec.ts | 7 +- .../transformers/babel-transformer.spec.ts | 387 +++++++++++++++++- .../testResources/instrumenter/disabled.js | 14 + .../instrumenter/disabled.js.out.snap | 86 ++++ .../{ignore.js => excluded-mutations.js} | 0 ...ut.snap => excluded-mutations.js.out.snap} | 2 +- 18 files changed, 842 insertions(+), 34 deletions(-) create mode 100644 docs/disable-mutants.md create mode 100644 docs/images/disable-mutants-disable-all.png create mode 100644 docs/images/disable-mutants-disable-equality-operator.png create mode 100644 docs/images/disable-mutants-equivalent-mutant.png create mode 100644 packages/instrumenter/src/transformers/directive-bookkeeper.ts create mode 100644 packages/instrumenter/testResources/instrumenter/disabled.js create mode 100644 packages/instrumenter/testResources/instrumenter/disabled.js.out.snap rename packages/instrumenter/testResources/instrumenter/{ignore.js => excluded-mutations.js} (100%) rename packages/instrumenter/testResources/instrumenter/{ignore.js.out.snap => excluded-mutations.js.out.snap} (94%) diff --git a/docs/configuration.md b/docs/configuration.md index b1965eec73..5abc56e65d 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -208,7 +208,7 @@ Config file: `"mutator": { "plugins": ["classProperties"], "excludedMutations": * `plugins`: allows you to override the default [babel plugins](https://babeljs.io/docs/en/plugins) to use for JavaScript files. By default, Stryker uses [a default list of babel plugins to parse your JS file](https://github.com/stryker-mutator/stryker-js/blob/master/packages/instrumenter/src/parsers/js-parser.ts#L8-L32). It also loads any plugins or presets you might have configured yourself with `.babelrc` or `babel.config.js` files. In the rare situation where the plugins Stryker loads conflict with your own local plugins (for example, when using the decorators and decorators-legacy plugins together), you can override the `plugins` here to `[]`. -* `excludedMutations`: allow you to specify a [list of mutator names](https://github.com/stryker-mutator/stryker-handbook/blob/master/mutator-types.md#supported-mutators) to be excluded (`ignored`) from the test run. +* `excludedMutations`: allow you to specify a [list of mutator names](https://github.com/stryker-mutator/stryker-handbook/blob/master/mutator-types.md#supported-mutators) to be excluded (`ignored`) from the test run. See [Disable mutants](./disable-mutants) for more options of how to disable specific mutants. _Note: prior to Stryker version 4, the mutator also needed a `name` (or be defined as `string`). This is removed in version 4. Stryker now supports mutating of JavaScript and friend files out of the box, without the need for a mutator plugin._ diff --git a/docs/disable-mutants.md b/docs/disable-mutants.md new file mode 100644 index 0000000000..329006e819 --- /dev/null +++ b/docs/disable-mutants.md @@ -0,0 +1,181 @@ +--- +title: Disable mutants +custom_edit_url: https://github.com/stryker-mutator/stryker-js/edit/master/docs/disable-mutants.md +--- + +During mutation testing, you might run into [equivalent mutants](../mutation-testing-elements/equivalent-mutants) or simply mutants that you are not interested in. + +## An example + +Given this code: + +```js +function max(a, b) { + return a < b ? b : a; +} +``` + +And these tests: + +```js +describe('math', () => { + it('should return 4 for max(4, 3)', () => { + expect(max(4, 3)).eq(4); + }); + it('should return 4 for max(3, 4)', () => { + expect(max(3, 4)).eq(4); + }); +}); +``` + +Stryker will generate (amongst others) these mutants: + +```diff +function max(a, b) { +- return a < b ? b : a; ++ return true ? b : a; // 👽 1 ++ return false ? b : a; // 👽 2 ++ return a >= b ? b : a; // 👽 3 +} +``` + +Mutant 1 and 2 are killed by the tests. However, mutant 3 isn't killed. In fact, mutant 3 _cannot be killed_ because the mutated code is equivalent to the original. It is therefore called _equivalent mutant_. + +![equivalent mutant](./images/disable-mutants-equivalent-mutant.png) + +## Disable mutants + +StrykerJS supports 2 ways to disable mutants. + +1. [Exclude the mutator](#exclude-the-mutator). +2. [Using a `// Stryker disable` comment](#using-a--stryker-disable-comment). + +Disabled mutants will still end up in your report, but will get the `ignored` status. This means that they don't influence your mutation score, but are still visible if you want to look for them. This has no impact on the performance of mutation testing. + +## Exclude the mutator + +You can simply disable the mutator entirely. This is done by stating the mutator name in the `mutator.excludedMutations` array in your stryker configuration file: + +```json +{ + "mutator": { + "excludedMutations": ["EqualityOperator"] + } +} +``` + +The mutator name can be found in the clear-text or html report. + +If you've enabled the clear-text reporter (enabled by default), you can find the mutator name in your console: + +``` +#3. [Survived] EqualityOperator +src/math.js:3:12 +- return a < b ? b : a; ++ return a <= b ? b : a; +Tests ran: + math should return 4 for max(4, 3) + math should return 4 for max(3, 4) +``` + +In the html report, you will need to select the mutant you want to ignore, the drawer at the bottom has the mutator name in its title. + +However, disable the mutator for all your files is kind of a shotgun approach. Sure it works, but the mutator is now also disabled for other files and places. You probably want to use a comment instead. + +## Using a `// Stryker disable` comment. + +_Available since Stryker 5.4_ + +You can disable Stryker for a specific line of code using a comment. + + +```js +function max(a, b) { + // Stryker disable next-line all + return a < b ? b : a; +} +``` + +After running Stryker again, the report looks like this: + +![disable all](./images/disable-mutants-disable-all.png) + +This works, but is not exactly what we want. As you can see, all mutants on line 4 are not disabled. + +We can do better by specifying which mutator we want to ignore: + +```js +function max(a, b) { + // Stryker disable next-line EqualityOperator + return a < b ? b : a; +} +``` + +We can even provide a custom reason for disabling this mutator behind a colon (`:`). This reason will also end up in your report (drawer below) + +```js +function max(a, b) { + // Stryker disable next-line EqualityOperator: The <= mutant results in an equivalent mutant + return a < b ? b : a; +} +``` + +After running Stryker again, the report looks like this: + +![disable equality operator](./images/disable-mutants-disable-equality-operator.png) + +## Disable comment syntax + +_Available since Stryker 5.4_ + +The disabled comment is pretty powerful. Some more examples: + +Disable an entire file: + +```js +// Stryker disable all +function max(a, b) { + return a < b ? b : a; +} +``` + +Disable parts of a file: + +```js +// Stryker disable all +function max(a, b) { + return a < b ? b : a; +} +// Stryker restore all +function min(a, b) { + return a < b ? b : a; +} +``` + +Disable 2 mutators for an entire file with a custom reason: + +```js +// Stryker disable EqualityOperator,ObjectLiteral: We'll implement tests for these next sprint +function max(a, b) { + return a < b ? b : a; +} +``` + +Disable all mutators for an entire file, but restore the EqualityOperator for 1 line: + +```js +// Stryker disable all +function max(a, b) { + // Stryker restore EqualityOperator + return a < b ? b : a; +} +``` + +The syntax looks like this: + +``` +// Stryker [disable|restore] [next-line] *mutatorList*[: custom reason] +``` + +The comment always starts with `// Stryker`, followed by either `disable` or `restore`. Next, you can specify whether or not this comment targets the `next-line`, or all lines from this point on. The next part is the mutator list. This is either a comma separated list of mutators, or the "all" text signaling this comment targets all mutators. Last is an optional custom reason text, which follows the colon. + diff --git a/docs/images/disable-mutants-disable-all.png b/docs/images/disable-mutants-disable-all.png new file mode 100644 index 0000000000000000000000000000000000000000..7d22dcda3e008cc10a99eb9d42131657de86623f GIT binary patch literal 43744 zcmcG$c{tSV|2FPUB`La7DSHZ)HA40%A!A9|w`5DUvSx-+Nh+5 zv`1vr(a$2+-hbBN&(LcX7S}K~muz?x7mk1Sl@`;zlYoKc;D?&iKOR?-7#mKK-hOrzEW}n3$Mo)js;EsklC|GF`xB zb6zi5+|L#n^|$43uHbp^olO##s!IRt_DX*YtXSl4ANy>oo_r8Df1f-3xuLXFPqJY; z{!FEm`TJ{<7EPm@$g_W+3bG0M(<5zliAUZ&mP~dfFD}v;o9$e7zkG@RnS`u0XlKQf zFdKr|XqO7IDzT|E;`}>5i)3*N%hd{kjg845-bz@^w1*$1pSwm`ZeFc=kq~?%HTulbvs;ts*X1WMO()r^%>bsNcEehvg5w8{|8hpMY)ZyQ?go%crzgG`a zvy~JjiVSk%?iBTZ`!FT?U#%#CHNSNn<-)m&378CY`HJXQU2lq~injXRxFH7<$jV%8 zU7efzmxPBlHTNUft~nJQ_1*22XZCc=4h7@f6!Nn*Y_FGn6e>}opg>zQ{1+JWlCR}W z?U--iyJUl+tpAMJoA0ep?X8U6O@=||dIE*n#B-MWO#%1bQr}H3W+AT=Lvo~TqW_xA zuO1Txs!&R`l?&N!0xv5iu1mz|L-A7 zZc4nKWE^Nv{qCc>-SwR<>Q;qp@1VKU(>=Qq?1Of;reXqY&B|dc_&YLl5_R=oZ)6FojvL9tGF|OJiJW2dU zV(?|z1bVGNn|~J$I%aB+u&BCwO5EJ2W@*x%8R~xu-;DVD{6N*7ZQuPZ?O`bt!>4|B zYfa#{Ep=`oerJc^{p88{(j;S+`MR~l^{qRiMNSXqVpmt!bgdA#l$09Z7S$WRe90at z(Fs0UVIKm0%3A8`vz3f}ty{ZWjJe$-O~^7p;B(iVtPoxJzThnmN7d6;RaA_BA3iPu zqj=QCbXkd0vDl^_Ae7$8{a87)YF$M;+wOL9h_<4CVYuN${Sq4#D@rqy~-fgTa|_a zLz$$Kln-vrO*{IuV_DP)lvp{V+OZZlpW(%} z5!43!(4agYob8PB%2BNI){5eu`~C$vUahP|aXVmeE!CF?>z=4RIk)*LrN9dS@nu<@x2)i9+bs68yM9EJK&g;Vr+fmG7(FGRgZqQ=7*EQ z*tohHNZFzS&2vJc-F7p^1JZnTG_!z$>~1PoshlZgZlO!@accQ7dw50n%{0^14}V@i zPs;i0+htFR!}{euot$4^VMVVKz^_4>DhWo95QKag% zs&45lo$TP#c>-#Y(fq7(%F58UzG$_Fk-6@@Z0B&pl)B4S8-s$8Jt9bCh}9_r1{E#ajT9>KSLYg zS)q;!@2=UyTim25(z>aVJuc88S!ZU4K6zBK&{o6h>Em&LP`}G$kN%XCrelh*X(3gg zI1PRN(fG1G+&$>NK~7~#pb(6!;#b;oAMGRb(NjGzTi`kVrC0mKo`?O7rJpWrNtZXe zhNpElma7VPMCW|7%us@*@^dSlc*mP`3Z);RPH2Lr^yT(gxT|W$I&g7KYIiF2fWrvC zH1+dmoMP?Aud0w+4Gcj|7BLu&Y<1;OcSe_-1W=rv^JO!sYm4f!D=WYeH3@o5@}MH& zYrm!csZO*lNzr%M2+o5FUnzhM|)DekZkuOIbWo$mq@5a&a?0vSUG@tf~{mnJ)*a->KwN z%>Y@%^DE$MPt8k#YXA@Azoht%% z{5NlVe+(6ukY*m~R0e(P2lETpX-DTB;8uSHSwZgzUOI&R*4fhq+|*U#o;!JUxb@0D zuw;{i_GN5)IiP?btj!E~b*qSU$-O0rjgq#>^RB&8Ut0u1;Q8`FsHJ01!JF*t>|NmW z9C4Hx%reju3iQ_}gBd)L7=%(3FsQ!zlhCvIFTt}t@n#xe{q(>ZuPj27dU`)++ zL{IyXq?H+7-znC!JgU}k2xZ{h0O_6@(Q*qqv!%{uE+#vSo`9#s!JZk4=y2eNhL7$X}I zd-(T!EpHn<-yo70y8JVYjdciW;lAi`dpMM+|8(N&%Bm!YNNq2Toyp$ut9K9F5wUoG z@7d6Zgb)9N*;a{R)Ibmyruzx-^ zoUFc8t)6m#?UW8qHh6iBx}&qV`p5JP+I)kr7l7pd8b7?zZA8$+9Z{m+r%G+IP~Qso z+SM@t$5uUPOIwi`u>FNPv+Z#8%h`L8cLwVsq7vQp1XEc)o0fSnH!_3vyyM7t1t)E1;I8T2{R+!pPPdS=EP@(mNNv{kk5*GVr-E1SFDk8P#m??7=3q7kyS?XE&jh;lPnJo0?Bdx! z#;DK(L74(ej$21w)bEvOQLkp+_=do&TJ|oQKE@hXG}pRRUXiQ+2Hxv|HyhbEj-Kpc z8?-|zim4QFG>gS-&&5Kc>WbL?U3b^SMAzHmdhrLWhCRIwL)X8DqtcYK`{%il1m?>A z4L$~fR$AE)&w39z2En*Uoz%&lw8ZU>knM1lw5K@sW zjPkutJm7x{Qyl(9>Bm;kr+Wu?mh#Rd?-0bQc7`!=@7`T%n9GlF0#Ce5f6*faBM$Gf zSYW0Csl*KR-C!xEO7u@zZ(tH{ku=(5zkaIxu1C1j*2?M@WE*!Si|of?YHL6GSY}qq z*yZJJDLt?=L5|-Qt9(`;Z>~-v-hy4(SyA7;gIrF?aSS7~Ni|7Rr9GZk^O-YRSAtq= zdTWpr;s>iv#!fb){^sP?Oynn<3+?aBm2}J)zoR&|84<>QziX>^n<+lFvDw|k_id|w z98GHHtTU2l=)<^fI$u92^KB11mL6b}Qw$kae!FX`+U|2U$L*v_!7J4t^{XS#N}l4>7+~2 zI=jD*me7lkCG#QnlNw5KnP*V=Y*pT?*!6cjYUf@%(ju1#>2}>Un=o_$6iNm%Uy|qN zxgl>cBg?Xs5F@VSG9t}ziAw3Z?iJAa`~chAmb}Z*DwLfG2?9s3*^?M{1PlCoCp`lx zf%RdsIL%N0JV}93yTS@Ykb5K<}8as$8u&vJMl^i z9DtGrEpWF0+x`4;%C^nDTkEwPcIWJPcQUQ(9+Jys z1GmD+Tz2p=wjrefdYG&7M0)a~wf#7IA2LUdD4j*|$v=ilu}wbY8He=1jY&=(cn~MQ z@Vl%-n>2-HvF)Eqq_t1u`|QhowOk% zkdh3o^>iQ3GXXIfXsNdBZE3ltBGD~ts5@+y6VHWQFLQtLpFTzHcWNP2mY&_;i(t9_!%c!&p!OS^Iu(cX6>J z)|kFCRoGjYUwWsME9XEjOh!5&F6#HXhzgfhRKx+>CD~U`oGdVAY{nN>Z4Bx`{-JBI z`*@$2BJ}tP%kynle(~+)6S))rZvyrIKNSFp14u;rm<10Pd`NSEa`RjnIeEG6H}r$L zrYRRdNijS)3i6B}(BPPQ%p4raH zd#ZuzuIKr-)m{($%umtm$F>@Orzm}=taWwKj!|Alq{rekn~{|37U~?Fs9u)`(0na0 zw6hJRyBt;YbSq}{wjCSgNFr#t3hC+PqNc=;gn4@6vvCN45bvUGYUl101CtkmvcvAo zu{q%Bw8c1C&#otuwq4~(?hmuFL32M z!RtVfZz|bz|F-)j)azi2x_jy*nCkQ&7sN6W!&+K^q1UdD8-}QfL$9`1No^LD}6^$#TpxkOUbITg0CkvmiU{GkgqRc4%u2U#3rR9Un?Ngytr4 z4r=b08yGl}P)IAo>-QG2V*PQC^mlix8v_*Na+Nhi2s%YMk#EiS>;> zBu>=gWvoWdVtp_g@sYv_&7Wyj=#)L3lcVL#>3g&rj)jM@NZHqTSa$+hIE0yr$wk86o$C9qug*|tgywgD~jYz^-S2=V+| z?w0TTp6sLuY?o5sI#q|cG8B=Vv1#j@`tUv6`!?66bQXMvkoj!X_aB8_n+0jYP$nVF zDkjDAVRnPKX{sqXI$R)uF9)r#s+QiL>WV0tmvE9N1Ut7~LM|H$ea} zUpTBfGM@eE2=x1}=>I{_pv8eb8l~UIwg)X-%e!(#{-ipr()>2HDHrOC=|mTBSnV9x zPRFP#gGzf<;|1m@p9e|VcTx?`mkL|hNQlkzy!}uz7Wf$ob4-UyKa^OQ4k_qVp;5m7 zVH9rN{L3W#Pk5;R0Vnr=YT{KKz-~cF{%zC$uF_wB^W_UD?jh13Qz`f+9KMz5Whi`Z zj}y2CtEnw=oS&|NK8Xg{tH(GIe-oT2*KOedvLQZ_o{Dz7eD=@#@-6=|H%PeACx&m!oO$*9qpmoO7JhreEJ&c-MXAP8`YerKT~Ks11L`gtH3ATbvI;A!$(p0G{s%0QHCEH66i}|?7GweFl?#JafvzjW(8mdMxNkDy3M*mLpEcrAJ2@(dnnuVgvOA;LyG>}FMI(! zJ1}t8Yd1Am{)(>-eJfy(4CBd(1(Zrz@F=hzXbYn&DR9fzdz*1!0E;KpUf@$kK6iR0 zbS)r7RY{SoKkFEPke3KS5}M8IKHLO2h=8)#^#CPRhlMi2cxg%-H@DK2DcSg8Iq#0F zoWxqnh@Qh8AKiMpa0WO`U+$ML8UMDD8do`T*?wGQ`g=zpIH%Oh{x*hUCn0;fm+c#1 zim6DsAi+5bQ*gl^_CQux1@^iDn{k3{MXC9E_>Rp;nGLB%9PNawxjSD$K$#4xeEZOd zs4Vu1Ma`ZH{PCn_-Rm*AWF9$Bl5VKb-2 z@zS@bx<1$7c`7mMWcs2lJL-s%W5zLKn>%7wo@1Bn=!23j9oGY>?A(=0=)RBl;MV~9 z8Hi)WoFW0kF!f?qHBdWDt2wOHB8S#qv zramocJWe^K)>vy8K%Vqokr*5tzog*RJgj>LK*G~Me&ljpg8jH+uUD@#e|Zpn3GzD}`w$~Ea9C{l0La<}zd%A~_oWc`hoIFA zvofPi`VT<<{MsS-tV?x8Df0^R0p=ZZ^$HQ=r_QOu?{5l~7vr;GWAsYnjJuSdg zypE}hetw}HZfcmpzdundSam>S{5NH!9C7YOUUr`uaBRJ{**eH$Wi;jj;KslqL8$6k zd#$+d9f;}&z$X5(BH!lWu9i68Ytr`LydoX^^vhSO59umTN-UXO6$}Pi%^Q!ZB|bYk*Q%*(S5$ka zKJ}V^y|mAxepV!Ycrx}G1eSBKDK+vZqGprhr2?H&M{e3sfsr`UMz1OhS?pAVD&7zy}dAzP>JZ?I@b;FJYrr3)dOo&X| zK_`GDF*MD19z6m(oHNA@D?czQ4z;rHiG&_^h#{+~TULWb)fm76-zQ8kG zuP3QUiI4P`1pZQFZ%0K^{p9$R@0K51jUC~;D(~~;LzbAI4;!{74ZG*XMiSjK7|y7A zQB5pI8qCa3*@(irS+O}ZVF^;d4{spCEgMQs^Nwr-W2ZZTNKTELDiH+RORd^Wes5K~~;E;2y= zw4k6izF&!e-Wthn2Dtn2*M%>9Kh?M(aL;-?lS<32L_it5Jj`WxX{;_?xT5FFZO8;; zy`IOM!IY=GkWE-glSwP=Uj0+-^+3FI<$6E>jzbH$obD;Zg;l=8GJf7lrR>@z*{7bn zx*D8UPeo|5I3q@ua~aE7m=L{r9`3A^j=cm@r_UPwwdR6w{Fv+$4rp{A0Ch6i4-+G! zC~A@=Lu>K1+{vZ6kLQ@vVD}UdZN6Ok=SyekJf4YoPt0{_oea9{_sxN*3Zx&aFInfR z#_(R2LA0`dDC*Zw231cJ@)rM;p|x&HP09Irk7u0A1?)JKtl+iQp>`JW0blB@>KhD3 zCEl$a4}@nukTn=zkX;$j2w)DdF^teqU#%j=43rN!%g9t;$()qRkhc*n8S-zq-<#Ce zJrxc@!L_*QbSBpC$4^Yaj8@oApiFMpSAh)jZ9}06fQA&M?o5z*{(#`+=$9i$i1zWT zuB<3Y0tT9}=5f(Qk9Dk>%lDXEbsS3++i>}O0Ku=m>33^N79Shp`DMqDme^Y}3Vg-Bl)yKdsuDH8hfwA2thXNG_VUt% zh?BZPq*=A`;4*)t9>eu*a!!HjsmIXa664u2m@qS@kRE{H096pk10 zy*MIaP1ktIE+%GHo}4^l3PPfR3*M_zy+U9lRjII^NVU9eRo}A->qBzvUkz=|)&1(* zADvWcs^_CuTH_V5%X||tQQ6=;7k+M5j`LElUmJe_e;C|S2bn-2PbwD~xWqggxy}u? z;c`LCg#Q*_U-uOr=#Xp0_Mg{$)D1hFsFQtE4&~JQf`#wBzF3~Cy^O*Or3d@LSWq&WgQFS|L>7xC?3*}0N(FyL3KAJnfESkQMX_<-i&rMYPm}+goixRF1`BJ&EG6&D=$;k{YE|d zW?}Xzbl*np4Sbu-YTIe7-gRoqP9@dfl-dTVtc>YcxKiS?U3fetcxNOnr*<9V(;CoemOD(R)GfWKxGstppf6BuGz%zDt~@ zqlDOdEK4ft3kJZb9NmLj9Rk{OloS`Eo?R&)o}D$1S;yKJq-vn!1zP8VRg~b4U%6}7 z;uX(P8H1bhZuD*F*(^i&prlVw?=G<>u)3`AVKcUqvanc}!o`+;!T?i5TTYU>vdT&7 z$c+WXRTGO6L^jVal~*P~RCqsh0`--+hT%%YU?6Atl3^_s*OML6+9E%nTTX%Lxs`5j zbnIdS181K@C+uG`k0i#=vY>0?NSd(6bCLenJdMilR1JpNA+8nB_|MALo7d<(Ra14! zKtP}~66Jk1P1tckGH&LJcvym)z;t!uKz1`RiK2#VURmDozyuz1;2$5=6HQxB7p`pi zJ?hYx@}^5p4=$uwO&eyPK&&Cn&mR3x1_=(epNc;!=M5op2=bWqQ@NeP z+nNQ$(Yay}G!|rSY=iY{5%)&@I)}E7n%SKrC}TgAO36bp?ci zyaWgaWX}5r749ir?YMY)OpiV~b!Vy-DVWQw*)lZ-6&LANmNO^`t6MFMwId%JEU!&z z3M7D1Qn4*EN6rnWtLNtSU9?u_pV3OuPWSSpO*l1WH>RehPD%NczhV#b(cnm+qUxQ? zuAuw`gM{391?J~XlAl|J?++}8@9GPS*}Tx~8wR*2pbi6N^V52-TPB8jwO$KywY|Ru zu*1RbK|-YpQGq$C4cR49k|39d>a*OZt4CAWd*RM=#Rm(ZB9NJhP%Cd>Gjz0(C!d{J zq=uaF0I}c+T(_iM!!7=hWnGKg#2;n6kg_pWvtME1Iba$V3dOf6OXXH4VG-A@5D&kO+F(7D-h2i^F1Z3kUW1~%!dG-7 zI$Q8oz;)2fQ2kDpdi!)E_!1d z0&8ZU*FBD^9Wh0mJNqerD0gU zKnt1m>#7`H+y&Kmg~G2~_^zlh(M^BxM%6fi$pJ1kXL7u!r38${3SXCG68s&?(R(xo zU~NEX7%6ADSW&)qy2hlm@{w)!jVh(e8QAQ2VeKgJW>v`oG8#WXB~#B3c?Cp6lRKd3 zS9MU?Xao+DY_7&P3ga7mro`@m(=V+aLsnxJXDXmNymCx-7o^C`yNr(AOLTKT+33kt zZr1tx>M0{#H>xcCC;S_))Yl~Y9>26A=nfDi5XPKT_han`7IvXbHuUJq8Tvm-f0huK z#BuaSjGtTwLFLFWDV6oPhQtOE_sMt&YkZk@9+y52g%vef5?V2&2l0}~cQJ$h3(8bJ z@yGHw+AuTgZQdxxr^Av7l0hJI0Nt;=kgftn#|Y4(9q)A*z`r&E%N|F z6;S>ERTp+4Y}UD@6_9r1#e~KsG(OP6mmu@`W`New!|u29t>pZItE{#bB)=+sW6<=Z zI+;0qlN}L$Y?-VvNSg)Hpk;$A)(u?5{G(S%+YfAl0_C7fS2ge7Vz#{l2FS zKXK(oYo{+WrYDy~He1>3lE0#yNqW!s*J_H!kJ)T3yl%)hX7`bGSu1B}pS`-#JL|#n zy(k-bGd?=SWPUEpdrRLU5#2}p%uzJ_Z8AjJ$UI2A?)ad{ne{lyq4XwxB9<$eAS-kxs82? z!r^NgH7db|fE2X~Y@5pr6bt)8FsAi4yl0ih=r`SHC*95`jZ0D#tQX68>CT1$5?56J z@l~Aw&elwwcK&f`rTIC$@kN*Nm#^Q3jH)YVEVCpGL*hPgUMxtXKxf+o|G4yyR^>fB zpYP=c)3Cf|Y*Z)wm_+oBU!N0yhtgTTb*O28&fXob9 zN9_Js-Inh0XQ{o4r!eF7PB*Cavvsbj3~*MFS%m252VYya!rDQ2)m%yey~^?zA1wDh zR)eZ*$WGP^W(}1-+Vd>9O&X6_D9V<6Vbjfd=z4$)`@_!2s%J3gk#N{rsx?ALSow5X z#-O8L6f_P1UkHPQw6Ckkt5~1yflyj7_6mTm#ljoDUr9J6TRcWSl zZ=CWQJkhGmweSNa@NjN!I~8Xa_SQELA05umnyGd>9c9$+zxCG2WuwrEKT>g*TQL;?)4)VbE=F`48=j&f2II zA%8j`tJJCv23fvjpi}=tkLXacZCM99WoBr5emHoYXczAxPjp>t@Gz8dMxGja=M){| z+ABlrngKTNA53sN`#^-68~#$R)^B+YzgsY;XPcJnh(YtM{%#*SgISr#{w;Bs6qrX_ zUE5sZ!5*h5=w<}|xVPqWV&3)gfvn0kW{0iyt`99e0NqYy=8I=&mNo>+spsekj^zBi z77$v;c0mNQ6!-XEpPXuAHGA%?%Aid%O~2mtb|w(71E8;o=RE*#ocbrJx9<2vR9B59 zJR0lvPpcYpyGL>B0L;xYDB1hE>?;G@Dk9+J5BR)&^=fxAox07wLHX_MsetnDPz|l$ zq{yx+ZgrOE4mv-VH8a#uMS@Pt_#-i-+`D!6}HiZRh7DBvWGAWhCDO4m?pbOQ~!vd`eBg}aRPbK*a zj@Z3KD@Sb(%G$*u4Rw3_w=L6pT*llI=5r`HR@hoJo}c{Kvxv7Ha1uK&Gw}a z|2m2ALZk*|x!5YJ_o^=Das!edIsGq`?3Wa-q4lq+XB%uq{wt6NULstJ7-|! z;H@9;7@&HDTRTg~wA)1>=$oq|ta%V;&gb6K_D{2XHM_=FlG^%a{D>Ih+smaad(SVS zXfG1{_$dHbSe+&W>l7wLbv*$(-%!*p;f$j;~8U^Sv^+k(GHLblDlJE^%W>PX3$9bTG-yca2^}c zu5x|=cet6uIpdfVgdcAw`(kP1)JAK=3f#cxi4tl(grxc8O3CcxR{Jg^@1L(M(?_N0bNVFDhh<6r1oTwYM}ZK{)o%uix*r0?KJ_?WeyvR-uj3 z*GD-Hx2zW0RLvxp18AG_mKUifzNz{f(!X0u4eewWLpd{5}?*rW)7+Vcaty}(E4DDgmA5& zXNq}MO!!Wk=j)LU9Yf7wpkamBnre6~Q( zH8|j_wYM?+NpQ;xkc?dP6F~kI0WYF@?*oRqa8{O%rqB^*yAEMNu9k6!&zQz#DWvFg zv<;X6Ml@n=Ync@bw^~^GxF%08Z!fMtXHXtUb;H=Tc+X1hij)=a;B2l0^`*qo~;J_Z+s zMyGgsYX|txJ*(*HgeRo5(JGq|f_+FT`YztXza^5E_wF*EV=Z!5)Xc8E|@ zuJo>piM?e^%|p_Y4N z<<|6wu@;LX>3LWxYs028(gw|FtwGvVcuvxT8_I%X!uvTHzrW;p853hejGUacZfN`q+}4 zP-_(M0jJO*&v@^!`36p!Ih3yaDN!^BK0Gub1dexKj5aX8iX(_@CdMb2dgLH&{uzr> zR&rZ~GP-YW${wSwzKz&g+&$}tD-VE+uhykYk~BCT^aLUSsMEM~lMFYxph2kdb1Q49 z|DJGpd@n?p`vESlW?fo~SWR{-3&iYXM|Z7jS|39_Q+$8DgdpQMN#fF6$?EB5p97(+ zh4bZRnCq6;iHG}ST73g$JBBJxDn5|t16=d7>l`pHrOHNg%8UUnN8ar?W#-<3J@;(0 z(&;gWqgIwyGp|J(&tapk_8iyqSIi$Qzijrc1{W`n6ZL6Ix9an!_*<|eoIMe)LOu!U zrM5OL-bo8Eb&zU87?t?cED>DWYPl}ogXp<_EO^2av`2QyP7=da_!zTStD!Br4Eka2 zUZtv^vzGjPRz|F5^z0^0RzFk&w$X*bew5xaOp~1ZCrYs&3Ijt()`wxB=D<|0enhG& z<^iMcq32Wo@ss+N`)3O7ynZ2A>dRi*pqwZYzhhI%&@A2w_DPt*#g~QH?e?_j9E>XO z69po)oo?3|OYZKbo2img=*ASnzCwgys_s`<oGMr9|p+J&@OL zPm6{NDIDy}zC1qE0dR+B4v`!nL=H|IkJ5d-@L~OBiPc&xk4@!E?MWX~_UeTsJ1#$) zQ<%#`YeyOV$erlw5A%Qs`w`2eI`p|x7%LTP12N|A0R!mo$kjTC%6QLHon3Rr*nKc2J4I{|>JG~^niMpxWi2<1=|BSM7l*M2h1(XZZ+(6zL#$gwkXeHo-FSJiEi z<)O2qGu2;=?{@tZ#l>%z3DQwpZ|GOXj{v_hIjuG;hYcR|JaBm4FA=0d01WDJ zRqPpsbAACT6ga6m_^7ns0=U%(R4%X2(B}V$=J>)@dTKit+!&9pQMYpas@h&8YOYu* zD9t_D%o12@>%IUA!BMF-1nuz<4dc+XbGRO^ zk7t)|LWC|WNd)L}Q zKs{V|bW8X!ZKxgj0pT#`qbNyadkpTrK0ORBn}Ta>r!ar+APH^HMb0SuDK+x^xz3?3 z4l0qpmRtt93`loGq>q8%t;*g|y;2Qgkr2>Ry+JoO%<{bNKDIj0)}lM8q^vFm+$*^H zGClnSqALgz`Vr0*x^p1DK#Cx6r>&El2M#h!Wr=X|Ol&Dl{Xx7MUmt{28+1d80l;|$ z99d`%hr4)w!9mYcKk7qVM1qGx z`8?e`b&SHmZFrO5y0)|0lo!a>o zHJdNRdOtdRj2$cdeZg&opO9pZSqg}RkW4-Cq+xzS-hTCEKyC!8@LR_0s--Q?&Z9W$N~yNSR0QqMg*9VM5G#N(BlTp^QOwvEzg&50 z|8RLD8f6Mm!;-I0T)F$nnkC=2`3(j6dMe&*DCG%I=3Pr0v^QsA3Z8P;Eb_c~)Up!0 zbcxZcFc}LbZ?P)F3y`hLlA~n>Wz4XFtM@UI6o17E@ntMr)~AYyRQTswWzj-F=oNfh zlvnenbElPhXluk0w+EG_F-+m`%z*Fu>ewvTfK#oPGZDC@5wDNvIoholt`SnGq_$DY z1Dlwh4>d7k8EG)xuDpJZtZ7k(X_un63QvFlw$)Cf)f@-9xm?(RFmmp_V?%=vl6x-iwoob>XDaP3?cDK1_>*!k z6VUE!GPbBDkw^kTB4U$K8X=w_z?GW7 zR{Z{k5LV__y0B5pyWw}T@8pXfmyZ|1Ez-qu7I7UNFm@7d+1#oghFn_-xP?US&*G3L z7-y88ECy`vX3Q>)5|0y;^(1U>fq-T~rMZRGxsY%iDz^f&ftcTdrt&~YShXYrN#Nzc zWOD=5N5*%KsAtN4ef^NMlPun&%Ox2td$tq#{^u|F$qt5b7o59@Va!ewHaLWRRihPg zO4p<<%D8q0)7$@R2D;Hln)&BVr&sV?E+}K^^~i&M2~F!Qm{d&Vz1ZlQ>D+59Jki^ge{I62ym#jjAr()J@K{Sf?Ov-OJ6S~yJ_i8 z0Kufn`+WSEy*lo#FZu{7qaNAo`JrWTO&K7oOYX1Lw$6@2IBBqZYl313^oJCpOCl&H z6Ki@U6xYl(J;mXakAkpsgQp}cedUj+@8UOIKgLN%Rgt(PeSjs87!vfowSq%^{gI}C zuX^XG=Q_vZ-bkxd&gwg?Nq_d~duL}^Zh?!MO-sHl|C8K1rWKYp@!qLC43Kq!E8BPl z_wf#)VoI~^^Rl6t_mm{QvKYV(_bx2eGk^_POcgCoeW1UQ13HiTM+d`X2zRcpZ%CJ4 zgOpAKZ5-Vv0UKw_j#ctV`79aEUWkItK1rIVZv(0ZwHcPBpO z+}y@#db(3r5HQC|7%0FY5gj>@zliZ`dE;gvCh-oiVNv_>yGMLJ;}i@UM)vvjQZF8R z6Cr){g+svg;qqrl9L~BtN5NxK9E5LSyX9M63FOv?M4gNg{bt+h5%AXx2(i{7ZBbBZ zw=Ar|&Ji;`EI~MQSXbm@!=-SWN|5nNJ8Vya6|dqyy}wtywEO3MwM^V1*IaCvw7VsD)U?ICaO_%G6|=vGz(h^K@%Gxt>#ow`x1FK1d%G{@kD90%%0Q`euRJXlCJJz`*n^ zB=I8rrh700V)EpoyYptMBVRAQbBm6<*s)i0@FJT}!_4rx!VwG9@9E=8kXmNBr@CL) zPv66_D^ABbq$37ow<70cf8I?g0Y?>*IxNt;%!F=73&OL!SCpL<>%c0QRoXuJ+1=Nb zN8R1F9P0I_tUwpTA*~O;j0q@B!0wB~6`id*>LDq!_DhS$*VM&<%1$?Acd2Z}+74XR zBY^-2(ru9HbW<+&c^^mVeU~Zkm^e^-o&;_z80NWbHED{`h!Oc?t*htMH=0v-RhL7F zoT%GtXsjzyx9m!=zMSmT!6<~B!pQ8`8ZcJ!WSS%$yBpN?82sfCNXSrY0A2pK#RA=+ z%luL{#LstB5aybA)0dK$)`MN1hc+zXB&wuWSg5UJTm}+CZ(+*j-+^-3`u*0e-~^&gq{7x zGju7-O_>&^I;ZRUfm}5Gf;=ICC2kFGEiX%<9;DsWlAb~x@0>7fS!6{3qr;t4mY#D; zhcb{OjxBs8-WzG98Q||T;baV zK{TYzkhXc3?Yg4M4;^Ty4>27(jNQ{|-lGo7`lUWVeQ8?B)Tq!g?niMVwlHfEkO%>a zkNksIuY;*%1rbw$Qe)f7Up02OEDWdW?0%Wsb)_YMt2QcTscQ($%zpVf4Z6=*Ul2N< zLR?39KMc8u$LC{mX^7{RJwA+V#(_$KgQ@*kr$g|kKjwdG#DZMdeNIHmi7Jq6iF0>IPonQ*{(2 z%2*LBDJf!dwwOO=?4{pmHGOxQ7-AXkJr`WsI67aIwmimpbRN<24E8lc(WZVV<(Ep# z6!M~$YSa|+wL@^p{Q%y7u^Jc` zV&W#F2|5(k&g%13S`vx9r%*Xte*~I5C;R^wb?*VyRM)kO`o4B~6+16TQE7?-0wNNc zC+!gdY|98%J{`>v+ z+;heqH)B8`duQ*p=9+7kXO_+W$t?;_(iubglRW2i1={bSJ7v1=RnNG=PGUR4QDj+r zY@QvLET>U|GTpSs6y%X}@(}Wi&5jSbB4uKjO<%BUAH1o>OJ9%ZYhd`3u@Mc${A>M% zDb-^V`W_2m2*o*iYAE}COVBWnI?x>XQwX|{xN&sCa^jAn~mB*IfNLf zO}w2>dP0;2@pdR#8sjvZYB zZ9(>%20Sp!i1N6+Of+Px;-YMYBKlz-F$9M0NZlF0c)$8};jN(m%)6)K zD)FJq%6hDvIQm6BmMEN_)29I%swC&g8qK!bP008v*>Q0igOqzL58{-}JVoon)kk~S zpWREw%Nb8fPHa<(n#PNc#h-aiHn*tj#O|jYJLE1Sk7(tO^=n!VQj|XE0)ehF7FJ7k zu8n<*4A-}jJOx6z9H-Bu#sT5f_CV}ISz?L<+&&(d$h;}8Kkdhlce{S2JG4uhwP*5I zj|K$Y1w!=_42uDBcnlYI_!_@i!xD<;ef|zn zX(A4I3kI<#GSizL;2LVMcVk*SmeU;{?ZMwnbX4jbZ>tP{vLBB*&%{|6T~{;s3%{z` z-~94IxYY&g+!aMQB{?ZuoUo80y#mz2P~G&y8WNtN=-s9=?)o=|Un*h8SsO+8aGhe+ zbPv6Nzl|f~sz%E0aZ=bymDT1Zp8%J*dCBYVlC}p;epK7gb*vptP;PbVw%COlEKJk; zA1===ONkpcUn&HomU6C5m{;QuXqP)@v00dD*D6~7!d}Wuar=bl^BKyFz)DU|^P>*Z zn7zf)2RkgvGXg5=0Y@9>VyK^6+0T2RoAvSOm%5t?l)2zhetG4{SYrh= z%LxdSMcO5gNpX10U58pual-iZHg&~J!w62|FUVBZ1_0->bLzt4SFFF*T%^_rCBC*a zoSxu-yJgwN$-T33>KsM@Ggrb4j%{44Itm0zm9raGGA?Vqt<<}{v#a{mq(Q)RFbk15 zX*SHh>VH-rWRC^E12LK+5HZ=H6b4En+9y~mYPJ0BpgZ04nP%6=0Ur$0r-NPUCw^kS zO7|zaf>M*Ge-DEy5?7XhCuICU+hVTkNLjqAhW1c@q3c<#n*KuBvs#}RI!XQb=LabhyPl!c-9>WGNQH$F;AX04{E!q*$(m{!R!A;)%CwCNZjht==R?I-c_kt zm&I0qZnF%q4+#ujoFOjxGB+u%Nw2kJ7P z{s}OVQx@-+|0MmPSj6Q4`{sw^lxt4Eyr7~Fu={D?@V*Nmad2D^idn0&hEMcMIG^_; z^OIPdqR%tpFUg=~lu>%oTjs5J(7R#{XLwKaUPjv_eQkX{x1Y+LPf#%149F_@!I~JO zimX-EiZ1rd@T%21-OCced3YWl@BWJL9rTqVRyYjee21#&Lm4UX4A!{xJJ1(stIr8| zClTd&Kq{)CA^1$~pFXLRh{tw<2=rHJ z@A;Guu<{FPFUbcx8Vzxm5-)^%E&u62&$wDBfGRA=rfAZ~yE~ScegV}O318o_pZM-e z-RpB#@hA7;?{!T&aFZTc zx{8_YsVAP)$w(${jU`badvAo@(1U39(ld~=-|L)Py5qtA<8 z%;j!~%pz*<|Z1 z2<>#rN&0_`uu=jY1iJTq_g-h`T?VOm0Fmvg77pXw?L#!*iHu+imlJJ=bZ2~5fBeus z?*eU~_KMR{T(Tv|ABmG#+t6d6WXJDtay%SMs=GzmQSZ!!E}RO~`@B+O;b==JsRUI@ zpk}VvkLGC9nyw-gtKzFFrms>702>#npO~@~>7D+k-s8^9N$D~tC=B-!VB>P(J$T-k zizoVTciyx}|EX!#1>6OjBQIaT0Wp#M%XhU;J&D z8Y(FGKo=8M9dj+49rZ_i=MCgoEyHvO{M-QL9Vz2=pl_u@`#H3^Xst)Fq%m?Zek65$ zM#mI~lHL`dFNS!(-y!M1zA<$osoL3tp-(ur{gdl!P^?|H7psoO8N3~@G|LS=ijoJ} z1GUDMRnF|)3)QBfb`=-I*=B{6A2SNO+gJ-)PseM75Fl+*W9h~2=OxvVt_|hs~x{)f$i{t$?m&5^==x@vacZ1 zmE6LEi7(1sYg$qKz1Gz}hf!yPxK=fyORAeiKUb*LD&$+D?-7W>eXfEiPnzkutgMu2 z9^41@KC=AIy#oQ0J^-zGIPzgv_}+aKO4m}**I2;$jV``>@o`!G?$ri0 zP}k~!amPd~c>IkjhcQl+JB_7ScevmBmgd}1vA5fs?XT7G1wuf0m9*KO7o841jx%{O z`L*wkRCAVj+o9J7`Yt+kjEK+33-C?4!j2~&!21Z@3Y18Uy`TcYD4v6!5WCgQSSEqy z6W>y`yZmHf9iVm0@@GQ@D~-E9J9p2pbGzFeY!7%vj+3V741r*4ofIM5cNu{1q9w#j4Y_Wi_ z(8Y&8mmQtuxnG`Rs}3CKg4{P+YH*4#$bR4h_SzDYYA4PwcO=|@ImM{GB)zh%(5`rW zf=8i+fy3F41=@io2n*zt4Os?P>)K0uRyq9@nS-;E8tJ<-W6a+#KmT|Gn@M?|#>9 zZO1En0a$rLPnl`zi^1osS4$7Hsh(1P=6s66#3MZ#(4tge`S`OJ41{ zW2hD{$VYn@sqEfjVK?E``FTD5B6MNYx7cr!m0|;iIQDhc2v*ZZU1hhOGin{KY@cC! z&OjcTT3+m6u}upRjEFU`cTT^!iF@4qsqfyKq+oIzDV#qD+tzZK1Y zxC6%KRh0xiUg%+0Xw@F>*g)Lfxf{+C8`F;C+8@RQ+YAJ!dnWi$?PQL?dN^6Va+YBu z^nN=+QTeFU4%S9}j9mcQT@T}J1WBhfj`!W$TXUbZv+T$8tFAAuQLm(>#DBCz*TjqB8^pKRB@Mp!7@f;a;7<4`W-$KCb^Sw?Y0_Q{caKQhxVk z#ZIkytIx&3LnYU2b24rJ=dG0gZ?3Ub`2An##{B=wOYEDy!$7p~WNefvZ#Z#3Tx`t6 zt#4L)ZY~mI<{c^xQd> z9X+R2mP51{&0Yu&cqXKU+Vxl6t=CgL+UgIYkM5VeE`Ix#vBa&(CJ;1n0oL zL&!@{CT$x-jxA9N(QPMO>JH(7$0TviuqX-~=rlaD^Yp=u#mSSjI}jbrxW`@B`So&l z%O9FhMb8Zr&Iio6E?HBLo`QB+1GjJx)Vz-&D_En>w*YGpy;TPOtlkgpjB}rN z9jLqIvr0ME%UV~BQ92|2T;?><0 zp_~iVDK>U?I^$TL9fEI8qV8Dq1oDDrlOLubsBy2!{e)A+0riVbCl-y)j9O#FMBd%f zzN%7zeznp36<6#w<;X4i(??~)PVw4vZjwzyMaoktlfDhd#e@ZUjO*^{Rz;F~G|`Tp zxLrEpn0>O7WAmLHS??9^zDhHNR_QZ;DIb3^I5NV&=6!Gla}b{|I*a=Y@YM(SJ9g4mdbfA*x(%{bA`+IpI7SM6lMw%-#6m(s8U0Oc! zrm=#VEZCS2k#(+yF_}s`EB8H)%vuG!1HWpjG4*<&HIiI1ifPSS4r;OS-J`5=^Hd4+cd0ve8zM00bD`x z(7^SCf8+vGI>zvu2Sm(S9*-H{bc&({ue2HkwFRmU=&nk0wQ}B7hi;z&Jh6*g@G7+V z4Y{ew`Sj^Nu%vPow9h8t#=b+IV2i-5d`R=v+an)Z0af#{R__SD^y)AIN`0nS#b#D; z-NqwJ_G(5RWbCQ5j1)|mPHL#IKS&iiI7_wVnfRk|h3VPVuq>n(y1uSv733~!1rZn5 zN-vR&~pAH0NtlN zOvUlNj#LlP$Mf!)yYu8D+<5#?EwD2-BOoQIS0TJIX=!N!h)<=%DXzi`>XSI3)4o=I>ehw z_TWN3!5I#Z(5RG09Z~dz^iIn6A_Ev|tL@*p)k4+-0PTfwF6=LMOL#ki7VVn9!_U{R z1KrlsN8M25<*TCZf$?l-3pUbD#8k2itmUEnVdvZh9tvY90Cb{b_84oq)>EiL*WkQ z*kIQey>n z%!6c>dlPCFNFHaA%c;ch1JxVf%k#zy-ws?e--H#Buq+`~mf$$pH<=R~KZ1lB!^pVapFJL9K>q-gvN?-b6shO<2`u2NyP)H$1Z1brMy0>0bxc{KQW1ZFG7lo<2;! z>~Esx@8K`w|a1XIpiLq8u`-tqSp>nm#)Tty$*?r=PaU)qy zNR2x~?dK!pXQf{$p>*#vYO?<V{4(5?j97u>z+uXjV)> zc}*)Ha+x@hb|jZX$r|&xgPBZ|6QEY6Zu}BuO$gA~tLF9rAys~cP}M(cQXwnm^J=## z7S8NEkaW&R`_iq3&uY}`El0>BMwtBad~m)mdic75emGULKh+BI)P78{T8J))uNDfg z^{bXii;WeI>=Lp%ftSeJWZOl@UhVdtY6Zafv?Wl3YEy^W#WE zgIXW{f{H}?9YT1zpakfWOI#Lkv}#@&-<-M&?@)DC-h zZ_>P6ZY{E*A_V5|UqmvdPShvhH;;ho(v$cP5#){ST|4N&{>gdwPJPU4G91ar$7j>n z7JvQJXy6ss1v#28l=`mdIV9T5ddQ;JEKtSqmZgwvt$f1hMd#eYAY!pmky}YDKc2mN zUH{fN$0}OaSw~`*rDNP!23b+_Y9IZfJo_aR+;A(RHU5U19;ecP6anjX+xHH<-?=Q? zzASZE{sz{=M2I|8Xf!gdWYI~SH#CwkzBiZLR6(awjEc;x6~j+baYgtZ`rASDM*(Sf zTGjYP6bENTQ;&q&`@Uz~ zANCJ$doYY&+YRZIZ&yp7ID3YlqVsdVpt1(AWiQ;!6z(jl zNAky>mueWP+2cPKk9L1sfBsSUK>mZr0qUQd@ARlAcRk-Q0XO|-*w*MieuzC1sV6*b zBdMgrjF{!&eBtRc9_A%T_{zOom+t}}=)(8Ov$H34?fyZCX)Da;Q#tifgt|g2ELp(o z=;yS#oS{C1dUeGfdt2Zf***?<21d415HUL&EEV%;ZxvpeaAT$<+P^dXdUp9Is~>5czw_Syait04*#D&Ato0oc=3#W zTYGy>X698fz0|Ef@mEaq^YWsWmRwr}F6LQVK|FijwuC0c$KSBGKg$`}Hv62SqVuxa zeh*4mZ#@L?)=gpYrPj^6u-~_iiWJnn+L|KKmu3&=P>{dN1{D0}ry!bmPX!PUDPK6lEFn#IwwWNfthh6?3PotsYk6(j*E6kxx%f+2|u8Dm< z0)YHa?_TFnBierJ1}9~t8PAhH627$dVS;SBQ;5oHTl#z( z=ZqicP$^$J4W5sc7+;baJ=6L9VUm(B{2R5eceSoY7iNyT6h*-Ls)tw1ImVzZ6^M^i zs+|HF@l@k4-lMMv`pVEZOjqT%cFNN~tcITo$<&tzscF4&OvbBXvc~X&{D}`De4i_(rrk-!JW_R3EQ+A zk77?;Lh0yqhv`Wd`?d^FjdQ&?+Hl)bCEgQw@D!oL2ZDq_ICRR}1ZM5i$#xu06E9x3 z`J|s+QE_*sEBzdxLCs8=xw??STWKbv~3Uxt9~HA#or&IqGeQU z+m7xH`XX!F7MC|p==Vy&rgTKxE65ZFI)gdb*s;6vY-vT~L-US?C}F$@HOHlWd$sbx zwd8#Wx-p&}uKB7wwmDG+jD==B%w+fV-5#p(cbgiql9%)$t#;C2ax!&xMu|!w1x^R_99_! zn|wsBd@u^KLxqaqG5opofYVExCoBWh1wY^}&1hElYgcTrITZ078#(@_-||vDFYl0H zU8;0inEiKPAX@8Aukzv1&ZApwG4{f(MxFyx0nzJxQoxES&J|#FaVg~y)CDk@gXxD+ z0y~Uc%hRvH#)aq}Yv&%ZbX0;khdaw-PMo_r*;p}3&31#HbD`PW*l>i`<9vLByBKtN zK1>*2YQ-E>9FKqmF{y;kgm7tGj}*!!ZP|Iv7N1h)#(KzkUus7wOoOxFjO5a;Btzk` zK{P@G+I&Kul**BTZzmBU$PzS~p)6rxnmmH6N`K+xi7mBHy%dx(Io56}siQ_x9GonY zac1}-x+;kD@J10-F%P-yL=tv=DL*y{f!{x$=QdR?ds)*;D zsO@-AEVv-N`#2m~#Qu#QlhalUq+9Oq+M6c&8q;$S=`4W=L1(Zx)Y zL93RaBlRo;wDgt@jb;p=6$PNNXem{cWfWB9;bgnCM*YLOL-%V7UlSWEOf99e1_#f* zZZ?Y$VkG^NlMGo1ib|mzK0xm4Yp~`c3lGj#oITbc@TA)TE&R>rqFRjy?=P;5E0v)c zX(s}ynWmdrU3Z&gR9hqafye9;ZbI=Z{SoZ;=2MQ?NLnuWb>(Zky!e5E0kHp^y=(UH z%8aggy?NjtQiWG}$1bawfA{iwPjOZc^-@tpkLUjC3 zCH?;(BEfmvw*B|Y17Xkof&G~)4ZsEXLR;|Ia%@?DgHwgE# zSC~r0SBUoc1l&+m_*_4^W@Q7$|Xa^R3J3NK$NqVmM42>2dPPr@Z_>Y_4mPe5~ za0c)X&K@1jUi&eM%Pw)R7^8<8naC6H6iK(4ab&-95oV1NcYv4v;MFMh#zSbz^)fs& zM@~)kI(f%+tgMq3%b0t2mj>~WUs7rSgw}Qs9)uiJP}_$w@>cn`5)9N!Q4kv$HZf` z_2}HfF*USS*!2RLA+g-aQ@<&A#@ZUf54!S!=k`4^fu$!F1zt=Ed+if`OCB?Q@!nnk z@d&KmJq1gFwfc>}kB#ePJ>rbAY>Zhkpv2Sh=KL3Ut(ESL$Z9G0SKUBDVpiZN`Ndy! zb*&;qDY2WmanB%ItxGB!T7}2x!gKWtt#$nmPP&^uMby%11`Cz)D=Yr_LfZ}D1jVtS zznE2DRrJ&@(b;wkl58*A(N!7gbf*Z66c-HEy3e4gsp1|m3V?0k9Z-@;s$uUg-y3^~ zq@gvs61c8ZuUBW^B=M7OJ1g|(*R=8cDqVkF?mcvQYDc6c;rhz&%PSM#+VwG5!<`wVj5a7-6l4XAIuDVp%@F`siN zPu8GUrEdhntZ3Zml(oQG<*sZ*ps_IC#$uwB_4M=EFsu6A5|2`^htgEfmr8ZpA0CpA(Fc&6R=yDvg%my<05*mN#f*8cQF1*=4vq(S4?tc zl?LiY?8ZBXAOOQI^Ky0z5Pa#fwjnRSJOEE`SXx=X`-ZI1^=75be%P}vuXSb4#~^f?f)b9EXgA}X;!tA2+QpWQSkkU8Cy)S4?mfErtHLi4+v~76K`MOb>4&M zz)s%SAkV4Zx<#FKcUpUba8=+Da$_#rFzgIAlPy_3w>4u2~m{rVuaX2aXUeTBu+no(6t(tJs5Sf_6Rrr~|$S zJSuP_+#s?tRKf9OQbbHM^L`_meOOw83zgFSXO9*Q?8e^J%k#6Lk%|H&50>G7c7F?h z|9VnrRL)hX_;RK-m=^<6YBlV>a%=PH$+5fUwd7tgk`N1#Ve3CmVF*?c$CR#OEXh))fGW4r+C!2|9Wn_|S!c50XDo9C|%SPtAmQ zT+)gcaz^hpjtX8AGay%VQDi88_hd}EOI3|Np{&+d%ugCO2Lj>bix%eE~XuD(62yFqxO4+Z#gAb z9)iFB>%N20@(ks(wu`z@_cuG>d$cHX)CdF_crY<8PJ8kFci9RrB#76oIz3vva8~e= z`OTX*PcMWEwO5(VBXx3HS8^@m3p!cTn83~ca`1;O6OV2K2iCB2cOO)TxB7IyP)+YG zRZ{{&2J$Dzm6`Vv6&2mv7#AB86O(?+BcnGm6@mP+x3od z{-gK`t}KQ{99bC$`CM<8w|pr9XKY!K7 z4?p0iGI7JuSd@bY%*U*a?eJGNTjRyItv2GPyW7!;wQxZa#hc^wJXPS(7c;q2pb2>J z&Xjr#E|wOWTkE4IYh_y8?u!T{Q566A#H8zebxJd#!7a&^j{aO|&_pj}qrDsS?z?Ir zWj6Y^R|AultSfnV->Ym_a&mUV%79$Sn>vN%d8E)IXyMsGct&Cou%RCpQ0b>QhHG8x z&wog*UxxHi{dVnFNcaH-9eVLV8HH7ttvGTXSpOz;_C15hd~79Tsea~hdEI(eqVTxy z+(vUIHW#0W=Z7b};yQjkK#jhTdmTn}x9ImVCTLk+SB7U1&`85~sDQvZ1}@QZftVN< zO@2q{j$Ph&eTN_p1KzZUMiFNP@S9b(p(G@%{yVQC0wXz5Y)PZ9kQS5Ci7gr6dp<{v z4P=}xGBg79L}X=)HwycU{TlEPuQYgx($ZpS9-@?s4UDP;;MsxpJWYA%-Rwk(ZQEv* zWmP$ro2(d${;2YLiQs#RqEf;_@IK0O@}d?>*Lv8-Vuiq&T$%OSfk~SDUXep@8qgWS zcnoK(6-dF$wy*z6mHk3EIH*-WdcD*KmPvhQ91r$jMOXyK8wbl1y@>+$uvVt$`SDYcqnpMe zhH2Le=;*a$_|iem`uTobhQm6>5dK^tNrv`tNbH^W5Tz;ao9^Hqx9L84z!Fn{Gny71 z_xn;YudklUigvG5uJm_MTtro*%uQP3HtUN_YA+ogc%!$hy0j=`|Fx#|=ZCxaJc4AZ z!#cl`2fpq|5x{JfhHDkXHaNkzH6&AbT1`Z>jWI(~?%w zoAfwRiINd;w2&1=1=fSUUnD5CZN5bA08HVJ;?QcRV;C{vX1ErLZa*d_JiWMz<_jOx z%G0$r&5%t!0C9sB8u+4FBD1)=e{8!#iY}F@2eo~`bc*fk>jQzg!Cot+h6-K;tR#i> z^H3Tr|BPY#lB}$=07B2*W_STNsHXuO@58aZMDgNm# z?}FyhxI=pEo8|-O!S4?6?O9$UzA=B=F>mgi8*Pv1a&O0?{)u5_QB*252Za(_Vs#zF z@5FB&FVZtwF)T7#t*Sj-E!YdN+~$BymPb|`eEZj%I9d#mXq~jnrK~FnFzfaHow&M} zm<*$34_~hLHq8}uhXEJ11DgLQ?bAyu%zaEX3u=a*NYn1$e6-QHx3Pln)u4&ikJ0%^ z4e2W=v`$epxq9{DO#m#I+}^x0<*2@yvk%DH$gog*wxO}!h?LwhD@^&KV_c2!8gEmY zf$Vt7+ekZ+W`IC&5Ra1=KxE28_JIwid@m&IjlC6Lexw-y*Pfo_I1}Uu9{0a}Wqe6N zH{NuhH~a$o64E5F%w=}N#jyNCWZ+RhV${FgybauoG_BlVvc@620NU&8k8F*5K=s@( z@c_SF2SQ$Fznr;ujxVNa?(P%LfB&Kuo)VC+J%L)evA6J_wMr-B(A1EUTHODrQGopZ zt>^v*U&4kP9_KzGcBzzRS$Y(_CvwyU z`2N$3e-DYpc*`%mt=*-%t0Bj|Uvg@iH_Hc*HI&Yz~AN~Ut|5Y{ zVkN;xMI^0i;F*fjxqn#;Q8U5zUu?a-(?^Tn4>}tQ92-y<0y70K#_t32+2h0bmXGJN$Phqgi#shwa~F){MY$RoBuWluupTLNqzHw+5r5jWfx2saNpK5 z0@4!`wYSIv9PKiJ_+NhZNfm%!vO2q2(BEX-0Az$&Z{fF5N&kNFexsHDgrxp^|N6g% zYD!IRIfeZL1KzOfJuXK%6h4Wtary@hC=|-eM9qJ|wgyuk_4GR4<( z*rtNN{_g?PB=q-d0}H&rzh5Iwj)uri{!LfeOQ)8T-lrn>Cavh%+|*!HhTDM`t2%unOf>d=1- zRRABbWn%#G@ozxs|CE&13(g>6J!f~;j{{p}+d0l17N2UQJK6$pE8Euc&J+WTnDc>fB#VhC&+4*;4-rHxad3~?X%nF=kiC_g z5e1;sP@g&<=UPPQF}#C+JV5=th68dD12{ViOaJ;RrvObuWwu5?^Q&`rxMB292Qn@X+c)qxpz+# zuo()PG{LL^X$c{Z*qd|%+hct`f9Ew*PUWT-2Dk_$t)4>x09}-#NI{HT&qDa$+eVHY zTArzDam*+5R-0&62x2+d=rTjXi|$;$t74cm=o}(1OIzVrIBsZho@1LAr*YZ+EqRT* z!<)M+9;`+B^GaZiMF$UV2F|~z)@*$8rAyafvFNHd_^&dQ_ME&knndk>LIn&kRjd-e z#oM<{fqcSXAe^{IE=lY#UgGh+lZgq}gWliyL3v=u)7Bbne=Ka!;EDWIC(Ni0RnVbY ziXvYuQ*fF9_Xorlm53`Qk}nR7Vnzo~R?m+cTb9qCpt?em1$zN{`%TgK-j#0uA5|@z zgkryJ3#gf*|K>**?zU&+f^on=Syn#ntUxKrgtYi`9`yH>d{ic_CC}YHKTyV*=b6W+ zM{JD6QE_1q0G1)@hF%(i=T2V+sHOiwmkfwXlf4-YnF{uL#!pS|E+E21ltG2{%E)dP zN1k?yuc1e&vx4SGC^*o-za^S)s{{24<_heo<@I%&rV4V4yH-=h=-M!>TIsldNG-zD z%Rb*9N+nJ`v>8SttLCpMsM8o17c{z)B6#qW%@ZE*5GC2->)8W)5T|82cXFPu7;EppXW-bF!1VBxtnhr#-TE95`2BkU2T zR|+h>1;A~SB!L9&H2~1;R1=^Vd&QyFmTXjE*xf5+T~Db*Xqe%WE4%o*2MeuouLkJXgIfXNrUBQ#ew)_!b@ zt)Bnml(RAdN3Ad_j$S~Nlv;S9Y5|{?WpDh^j5I92_+bmwe-0ET(4kwRxv=mE?6{1; zUt3=($RFbf1dhDo{;na60pS!{&~^uwwJw7bA%xrpcpWf7vP0g!P&lK$;0Zqa81f%c zzyDOgZpAVGyFlXqvA8Zm8)|g-?hfob4&Ao>wEg^YFGxC+v2JSlT57$0+<5Eb!}nk? zsVuF?8v#(#%z>DYkbP&Rr4!4_%04P=Wu9-VZfk4H2C-WS35luCBkJG^8{2oay{%K` zoY&TNGwJdZfQW#Xz2^SI+->b{qYdf5wEWYquwRPqe?!(GO&dUNK#eOb64qBqtm(_qAq0b@6kGBTb^RlOn=}5NnrwF{Ln!K;1;#xdB;bH7 zIC#c@B`0kWq4T;mlVZLGk}gD!?z>@Vm@wtOaOfu!#0mh*1;vGvK_A>i5N7{J<_9OK zCEMOrDZ?p0ij&g{E@zkF9|5u)q<ycJrZnJ2bzd4^%G=9{O@@lHRT&iMB&8iyqzgD@D~JcIvKm(mKNP zl{54lj(8ci&#hMUXurcK?Y#E~sUHgMm=XbAyxc>>RwfTDM5BkJ%_eLLFDl?tTv=iQ zU+V+Y-Vl-LGUYe*Qk~+%_owg+mHT#saFJo6vbngpUR9IdSkr6W=nNO|_sz*Ff^Abr zK^|cP3_1@D270o5?J!ricJ_j=KAO!_Ym&9 z2yS!eZJyT#zN>WUyIlSBEc1`0p_xMl>Z3V2M*74j6!#R)L@!-(av;r^&FtEEXhIke zX&S`+hykCUe@DRBJ#e04uY)_csM?RL`b<%48FTynGCoWVENu!i#R7U!jkT#KmT4d z=LB+;0;5r_OBwoz*zJ)SqT-eU!*CI%zEX1=>m2Ui{mhp)b!j2KnCqWm~9{1e4kVhWn ztS=|=7>wa`R#&NCmG?_dvM;~a`uQ~uS!dTzxf*&@QR%w5AIW)0!`_1~uhjub?0F71 zxckhpyt4YJmR@I<9z@zh3zIGat{8evJlSd(;{$3Wl?vx=tTaN$VpBMmCtg%hFL|K*OX=E`jyp~tNNj;*X>Eh zYc@KsUS2&#_7AW$qRxpu?mzlK9#iStJ=UT&LtlmrsP*ewx^Os&3?2bqeFKbg9iI+&|UP^g?tf6FfNyhA;}fOeV# z;v9xmngYhq(v{N{L2;O<=3_6A1;TiP;>|}O*$u3ursg2$2CZKZphDSAxYs2OQ{X}b zoL%*7?%`(s{b3+T=F}cvC_~>hH&J_JfVZJH7ue3e%UaEsj~OV`qwXA0@v?;+RwcWYB#s{he7qxur0jd50 zR{zL4yx)h#i!Y4`tmWR(4>4AI3kY^)W>FF~pr#$q-hBX*yi_Qq?D4I!)WE>cR>tm=cGK;Z7f8AhT)>pz;`diz+Y zzttCAH9oIm0ybzw^LMbdX&b5e+<(p`IIC3kGgi1t$uiE>fi%_Nnze))+G*G;EM1-+ z`l^wrU%IiL$IaKjG%AQ5BmhKWz-@$|lZ2xSgyc-?{l* zm*=|U@3lXXHz*ORA;ZmQq6LMWN0~OnES?il)coBV#BA!r7UR9(^N5rzB3fq0}zBw|LmJ zMcjd!q%a8sFi&aTYziHEOWA~qW!yXdwiY8r140bX?`{0_W&e`IJw3%Pd}W#Kp$&J{{c z-rHMn$#c>1u}v-LlA<_kIq5ey8r|!f*_5`MCNlP69cNFRdSVm*RSm@+jRokmlilqsG^VAw)1wNqqfvJ6**aF3|8!W zUdd}GM!m7oa#adt?&#gY{H|8yOtCZrh|lQzo|vz9>ln9aJnXenlv*LdFe{Wo*VW_t zaaav*HB26v9;y3^uNz$-dhD}6t7@H3r@^gEX=c^vG~FCKJxIzfP1UxiJl zU;IlGcVQUlg(iYiaOFZ;l~KL82mUMVdMB6=I(k`MI8t;sg#q| z@!@gLKedjJ#U;(8r6fuNi7NG~W^}5*KeE$gz4m7n_^KnQ;Hfhc8i^Pt8G!bs3Np#9-B4W8Rv3 zgHKg0rWT|Zgr!wvl_@fuf~wCWaM$@n?3|BM|H}PZ18KIGb0Ku?BtVz?fKQQ;AC5D_X|>E|zUON9V`sfV+T!=n4E z%p&(6J42~5q^#<4R7gmY7h`7?k>DYW*JCx22aP2hiis30Xd&bCJlm+9!G~v-+Sbb_ z3|smfZ8ELG);o+V!*I&35txl+iI)SC9sR}FyI)i0%Dos#gQAmz#>@;)x?C6ei*V)n zc{xt1Z>YNWnk!-Uu%g$!i9<9`=(*kKP0QVSFdv2cv5(uFoi1TX@2lXC5uMy@xtyO$A;_s`}eq+x+8aEeI8sDSxX z*!|<&c>m*6$W9L`m=uxi?HS@*sXw}lCF?|Vk2`0u( zXQWcH)8%OQfW-z%1+WZ!AiWBtWaZHuIwK}^l7x~0Z>AYHFXw=;)_wO=lUT>gZ z?+AZVM{6DIv!ztUzKR*gv zAS3j4b9{)FV^c3+APoJ~hBq!zx?L>nfO5!@Co9RJ9LDxbT1|_QDF$BFDH9Wu+eo6W zV49kShw?p%-7x+WrSR7G+8P=DtBNI3mlFOWAIDSt=54~g4&yiKv>cM%?F1L^Haipq zynPQ$TOwB-kP$W^53cQ-vdoPW7k#XTExE0lq-Gj1ZYGhj@%WKa^MZ7=KAg^|v`jXa z`tn-D<4IXu1bL)RE~{U0)VF2GE(6RcFRf&>Yrp$N(?ls50azu(b)%dMfMSY^Eft`sQU7b&QcNjlEYvgUjbFv(EisKN> zY9G_oTxz$E$6jA)<=KVV_eflP@UNSf3j!63Z%c%PDAQ6ZLVx8uELq&Wb*9sZd8ALs z(ui!PVdl^L@@{Xj*>c5AUW;!5FMp%q8XSE#hRyt(7^NEEk`HRKl+KJ@`!LR%k>ba@>9^^{O}6&@5AO`%#wI< z=3#t>s=+~R?Q?HN5;3++4c=&>K#amKXg}&+Y|~FU34i7~96E^Zt|0Q1B``gA1 z-amHCagd)Z3nyXN+2G!X*AT+>W=5%;%PZf)z2;fd^cGLI1Eg}kek?sx{DZ{~5>2n9 zb=m#;mPGqwu4h$6_i}`L*B6;H5c%~W_5K@{Tw{_y_YfS9$zo?k_$^xvHXP|RELvsK zEDpXwZnYp9&VnXJNHr&l-{M5`pY^yx&l+7y`5WR{FM5StMfvU(AcUnr=VKa?s%y*0 zHh8-<#e4I!;>>IAy3(dzOk^bRv|l8BYBV>Ij5y|lBTSCKpJg#F9<8P8CizZlhbc@9 z=HAP(a_rRH>(%hj*P@p9XJB`AJNs$aY82!F#U+A;wixg;g9%3*ff8evLds3)dZc&Q z)eWU>xhM*e_9r7Kc>9QV2;We-Td2sP+4gmQPb%nC1l?)K#e zu)Wh=G(wH$RXifL&V|_|_&Z|)b8lA~b5)D{mGq6hRes#r?b?u|>4e5t_w@C((}S7X zRi2+xhlZ{elSmm1N|;Tj+oVjyE#Nq$P8NhV&OZn6t)>5>QVTB{#U2&8b(?PHk7g*G z=KLj_z%s!vodKyFV20X`HHqx%_1!PNW3VZx!qf+q{e% zZOF3jVNE#f88J8yC-J+s_ zNc0+4*go;2fwiRZnxjhHg!`d3c>GKYkN|kLCoob$kdf#!J=liJpv16tUsecu0(vwc zKzX+uqE>aCb^T&6In$Ep{;&qw=}}s!w0tjHJxjVeBCZtNWUF{vI-tNrb0ngb*`m5g zKrR`V+0M{$(4v@8!?>itRU|X@!FUyh@rjx4Q%<=Q%AYnQA^bZdPO>#(LD9D+qomw4&IWAVGd zpCGq!aSIQ6vK-P~5=alrYwwqhP-o)rME|0w`+h3&Iu=2xxRwT5mgFnOM(T@LpZ4xG zXiLd&Ie>PWDL|=!t(iuQTrA0_mQxG%7e1eYumaLwm`kZ)mr)60Qx&xc4iE1W&tX)N z=>j&5#D%3vewR?MZf8@!Tp_Q50#N>_ITO~$IoI98$9v+Ly`jY|0CT^lBc4$+rxs@V z&M;x1y@OweZGjHd`bNC&8eU4TgS?YQQSb5IhKcR7ufI-*n3B*@rGI(UgBUyhRb*!V zSUqoU;<{-0Kg2jayG)65liI~5QU35;OzW|vaMe+Q#IlZ4LxV!{s7}99_u&X$%VjkS zFo&8?4-?eH9rf8n-p;(D zi*NU8E<+@o!Xg&&$|#U`xyPfF?ME-1HrvD&OmQC#74``~&SuTc8{^T%!Y}oo)ms$R zpb-kI8e(BQJ2`7*vEJGXPjYx?N^d$o*f&N$$2pBao^k|`E{QW?*-q$VS{)ooeAp|Kj8Uz(0<{Rh_?{Q}N` zPQU9zO2dbvO7r{s`m25<>A&tdai!mskn4K0CDg7EylL7zFpCWHwS3FT^siJAs2JX8 zFec|0d1vQPRs3n79bQG1Oxy2si^fqa@2m>j&Tq+@L9>@2JO8bt34IOA_eO;W`qULJ z6pq^c;2^N7KJU1?Bqx_58MuZ3vyo-su`4bs%LFb%G$Q1tPE5jM;vMsbBPvRr4V-5s zWHM&Cd{x7P;ge=WUbO~X{aE9E%HKNZB(Fj%{Vf=F(ev)QfxiA*kHwt#EdK3yMamWk=2g-IJ2^V{2d97x5JJP3I52t1`ZQ-z;NfbelL2Pb zeLt){*)LKh-7w(9G+~#15$G48Xx(Ne%UAMVB%X7=7rM%e0g4?Ve^Ao9ksLm0#7qHt z#mzM|0F{KdfH~K|Y|ofAjbi$v>_>5C>r9Y{z8;$<2w$R9E;lj*M)J1-E1yuoT>mB0v9) zUxcFKqADN=5>bu^VEB5&E4q?m3uX?-u5}$;~q_rE_X&(FHv1D z4ABLx;yn_GKGd)8e8YEf^{Kt;ABUlQ$pjQ-pGlQYH%s2B zul%590Y?zrI6lNdOD>P}L1i$j%%=r7+91IpMVU6%Dczpv&(7#M#AL(b)5(R2Ng#H` zu|R1h-y$IuRJ@8yOVb;;RAgr0d3|d0-t$M89QS6!qP2&QX z|NA@k?|~7T!>Ul~{s*t?E708}$)*F-vF(1>InSQL+W!nF4jvI$ISk$XvLz}f3Y7PP^z)rX55VC8eQMe(LIlRbAY}C&zc10_ybtb4B zf;+%7gXJgNL5hi#;WO^HHM9%U#(!uIO4^TnzFSVNEq+Ueu6jd>ODOAQR}+E2`kEi@ za%WBos!2c>R9hNdD7XXSe0;32Ttxiy&?*qmIKAyTejd|X=9D$pvIjSD z`;ozmM+drhf4^=oTp5{?a<6w_M&#mf$cC`Jw_jf8&de5mY_41rej#N1^xf#Hw4C!F z-fSHJ%dD532CwP|3luWtA+OC)g2+p$f0y3(u#n#W$?qQYL^z#qO7fe|NzYmlJbacS zv04KGCt>sal)pA@pGf@4yNQdG3@@ex^1nO>rwFZeIX&G4(vEbsei!ACBP|Q!^sgLu ztkb7&f9jYEW@>lny0M4Z)LYZ`Rjmi)jhz|=sF0d+&_y!!{My;2n2YdqAG7$n+m7Pj)kkh}wNspt`Y=FR#vcr0)Myg{fz1;;QRn zBB7$xMx5b_+8}q zNp80*8in*_*}Mt-oq)3q63Y#h@#6rZljgz5nH@25W-s`BhCr=Zm?@q=0U=ZnGtXz1 zglMi;ScA?jv|EUEGaC5S)PPaJ*w#(>7%%*LBgnb{ZaOCGk2;)_y>aJ4eM2~!k!^yg z$fA~YY4}O@G;VhTQGRsY_upIHP& z)Ty%l-ULl8&GohXd#-brB}~5Om|ZfekzvF+C9a!Ods$OD5Q174?vIDh0K1UT0s9TR z!Xu4$iLd4X_)FQk0OsUiEeS!@8{qe3dg}72!L)Cj$`kJGLf{B6OHY=g%*1&gWQjY> zhB<2MzxU|OQU+SXs6ZVnTRq#) zJd_SlY~al_(G5O9;-i8S%51_wk?sH_;W*6WK}YLbhH&e;c|0t>VRg6h)|ongQwn~5 z4-Q~i94@rtX5BN#n$9*Nus#dmZ!Sa0`geRj$2k1!twXxC#2~G8v;DOU@O1N(08Aht zdGK4NNyK;oGIdl$3{V>@>$;}f8Z9whXA$D*hTc)ixrjF6Q@P{*!6!8xs;05VD5EN=h_J) zwvzJuU9`$w!&Ceb6z^dxkv;2{VoKh?=@0H3U47K7^9H)lSWMZb9CeMdKMR_}yj#hKIg=4GdTkNiLS1nSuU literal 0 HcmV?d00001 diff --git a/docs/images/disable-mutants-disable-equality-operator.png b/docs/images/disable-mutants-disable-equality-operator.png new file mode 100644 index 0000000000000000000000000000000000000000..2dab34a13ddf979ab1251d3736cd351c2bb341b3 GIT binary patch literal 45488 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

A4OX<>2^bqPwR;tyD zn5KSXGTz?$CpySeD}G7Y55kPfF>P?oK-KR+x$r0l$NAQtWfX5CetgJAb$#Prp4kkm zH1X%x3nj&=Hi^F2G+PV0)r0MUQy=O{)Em*P^wKv^Mila z0ScItzP;{GH(m-=QI@PBf)Qx9b#zm|NWu{u zz3_SQjpb+ORIJ-D<~PN+wJ3JIBX(3C1SHQaJ#&an8s^wEHE7)su6k8%vjEeyg4?L{ z^MgyC-@@B`?T6xya%Ew7w&&BgBBWuxvNyTz%N|BN!$h@y85f`en3=DECVHLMtU< zCR6@g#Nv)_NQ#XLvTimRdNDyAXYahRhY@#N^Y&ct`-*t3?N>R{nHPB|fpH4fp#&4I zo3*w;k)hOgYwz-P(DzJ&ShplzIz$rC@qPPFFKw@!U5_CdRj`vO#uo#n6H|gQ^P7mw zG$Qcx)bVRIN5(F@*IBCsc}k8o=kWQjnZaHcP3^-{cho=L&fAR&)~ zN&>KlWC-rDK*}6gUJ#&5mI`0FP(&ZM6Q7GS#Wsg_d9M8UbslYDzRgUWGn?iUkmS=l zE#eV*Hs7^x(`7!|SKwgQu4uK00>%D;VKS{yLXUPq?&-G!q8Cm^amNlh%3Hb~OMB;D zZ3X**j#lgqvdkU-75Fr?8wxFWy40;h<_|Dwa}~KovZ3oOE8hpaQJ7kv-CP@`{CWFW z$?vO4_U&w{VwV$GWap!tC+?De q#%X?sD2LZO7ss(tVX*&yfv6~Kt!A5kz-B9VNc)!l&C=`l{`nvFH=)u1 literal 0 HcmV?d00001 diff --git a/docs/images/disable-mutants-equivalent-mutant.png b/docs/images/disable-mutants-equivalent-mutant.png new file mode 100644 index 0000000000000000000000000000000000000000..2773b8ad592c84ebfc29d78d6bd13bdce96ca8b1 GIT binary patch literal 41778 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 { expectActualMetrics(expectedMetrics, actualMetricsResult); } -function expectActualMetrics(expectedMetrics: Partial, actualMetricsResult: MetricsResult) { +export function expectActualMetrics(expectedMetrics: Partial, actualMetricsResult: MetricsResult) { const actualMetrics: Partial = {}; Object.entries(expectedMetrics).forEach(([key]) => { if (key === 'mutationScore' || key === 'mutationScoreBasedOnCoveredCode') { diff --git a/e2e/test/ignore-project/src/Add.js b/e2e/test/ignore-project/src/Add.js index 0d6e64385c..26d104ade0 100644 --- a/e2e/test/ignore-project/src/Add.js +++ b/e2e/test/ignore-project/src/Add.js @@ -1,26 +1,41 @@ -module.exports.add = function(num1, num2) { +module.exports.add = function (num1, num2) { return num1 + num2; }; -module.exports.addOne = function(number) { +module.exports.addOne = function (number) { number++; return number; }; -module.exports.negate = function(number) { +module.exports.negate = function (number) { return -number; }; -module.exports.notCovered = function(number) { +module.exports.notCovered = function (number) { return number > 10; }; -module.exports.isNegativeNumber = function(number) { +module.exports.userNextLineIgnored = function (number) { + // Stryker disable next-line all: Ignoring this on purpose + return number > 10; +}; + +// Stryker disable all +module.exports.blockUserIgnored = function (number) { + return number > 10; +}; +// Stryker restore all + +module.exports.userNextLineSpecificMutator = function (number) { + // Stryker disable next-line BooleanLiteral, ConditionalExpression: Ignore boolean and conditions + return true && number > 10; +}; + + +module.exports.isNegativeNumber = function (number) { var isNegative = false; - if(number < 0){ + if (number < 0) { isNegative = true; } return isNegative; }; - - diff --git a/e2e/test/ignore-project/stryker.conf.json b/e2e/test/ignore-project/stryker.conf.json index 90ba8aaf1c..9007679fbd 100644 --- a/e2e/test/ignore-project/stryker.conf.json +++ b/e2e/test/ignore-project/stryker.conf.json @@ -9,6 +9,7 @@ "reporters": [ "clear-text", "html", + "json", "event-recorder" ], "plugins": [ diff --git a/e2e/test/ignore-project/verify/verify.ts b/e2e/test/ignore-project/verify/verify.ts index 43b3ee5a4a..8c9374f904 100644 --- a/e2e/test/ignore-project/verify/verify.ts +++ b/e2e/test/ignore-project/verify/verify.ts @@ -1,16 +1,52 @@ -import { expectMetrics } from '../../../helpers'; +import { expect } from 'chai'; +import { MutantStatus } from 'mutation-testing-report-schema'; +import { expectMetricsJson, readMutationTestingJsonResult } from '../../../helpers'; describe('After running stryker on jest-react project', () => { it('should report expected scores', async () => { - await expectMetrics({ + await expectMetricsJson({ killed: 8, - ignored: 13, - mutationScore: 66.67, + ignored: 29, + mutationScore: 53.33, + }); + }); + + /* + -----------|---------|----------|-----------|------------|----------|---------| + File | % score | # killed | # timeout | # survived | # no cov | # error | + -----------|---------|----------|-----------|------------|----------|---------| + All files | 53.33 | 8 | 0 | 0 | 7 | 0 |*/ + + + it('should report mutants that are disabled by a comment with correct ignore reason', async () => { + const actualMetricsResult = await readMutationTestingJsonResult(); + const addResult = actualMetricsResult.childResults.find(file => file.name.endsWith('Add.js')).file!; + const mutantsAtLine31 = addResult.mutants.filter(({ location }) => location.start.line === 31) + const booleanLiteralMutants = mutantsAtLine31.filter(({mutatorName}) => mutatorName === 'BooleanLiteral'); + const conditionalExpressionMutants = mutantsAtLine31.filter(({mutatorName}) => mutatorName === 'ConditionalExpression'); + const equalityOperatorMutants = mutantsAtLine31.filter(({mutatorName}) => mutatorName === 'EqualityOperator'); + booleanLiteralMutants.forEach((booleanMutant) => { + expect(booleanMutant.status).eq(MutantStatus.Ignored); + expect(booleanMutant.statusReason).eq('Ignore boolean and conditions'); + }); + conditionalExpressionMutants.forEach((conditionalMutant) => { + expect(conditionalMutant.status).eq(MutantStatus.Ignored); + expect(conditionalMutant.statusReason).eq('Ignore boolean and conditions'); + }); + + equalityOperatorMutants.forEach((equalityMutant) => { + expect(equalityMutant.status).eq(MutantStatus.NoCoverage); + }); + }); + + it('should report mutants that result from excluded mutators with the correct ignore reason', async () => { + const actualMetricsResult = await readMutationTestingJsonResult(); + const circleResult = actualMetricsResult.childResults.find(file => file.name.endsWith('Circle.js')).file!; + const mutantsAtLine3 = circleResult.mutants.filter(({ location }) => location.start.line === 3) + + mutantsAtLine3.forEach((mutant) => { + expect(mutant.status).eq(MutantStatus.Ignored); + expect(mutant.statusReason).eq('Ignored because of excluded mutation "ArithmeticOperator"'); }); - /* ------------|---------|----------|-----------|------------|----------|---------| -File | % score | # killed | # timeout | # survived | # no cov | # error | ------------|---------|----------|-----------|------------|----------|---------| -All files | 66.67 | 8 | 0 | 0 | 4 | 0 |*/ }); }); diff --git a/packages/instrumenter/.vscode/launch.json b/packages/instrumenter/.vscode/launch.json index 7919d57ff5..98aae41cda 100644 --- a/packages/instrumenter/.vscode/launch.json +++ b/packages/instrumenter/.vscode/launch.json @@ -4,7 +4,7 @@ { "type": "node", "request": "launch", - "name": "Unit / Integration tests", + "name": "🎻 Unit / Integration tests", "program": "${workspaceRoot}/../../node_modules/mocha/bin/_mocha", "internalConsoleOptions": "openOnSessionStart", "outFiles": [ diff --git a/packages/instrumenter/src/transformers/babel-transformer.ts b/packages/instrumenter/src/transformers/babel-transformer.ts index 1c8c45007c..0ec16bd95c 100644 --- a/packages/instrumenter/src/transformers/babel-transformer.ts +++ b/packages/instrumenter/src/transformers/babel-transformer.ts @@ -11,6 +11,8 @@ import { ScriptFormat } from '../syntax'; import { allMutantPlacers, MutantPlacer, throwPlacementError } from '../mutant-placers'; import { Mutable, Mutant } from '../mutant'; +import { DirectiveBookkeeper } from './directive-bookkeeper'; + import { AstTransformer } from '.'; interface MutantsPlacement { @@ -37,6 +39,9 @@ export const transformBabel: AstTransformer = ( // Create a placementMap for the mutation switching bookkeeping const placementMap: PlacementMap = new Map(); + // Create the bookkeeper responsible for the // Stryker ... directives + const directiveBookkeeper = new DirectiveBookkeeper(); + // Now start the actual traversing of the AST // // On the way down: @@ -52,6 +57,8 @@ export const transformBabel: AstTransformer = ( // eslint-disable-next-line @typescript-eslint/no-unsafe-argument traverse(file.ast, { enter(path) { + directiveBookkeeper.processStrykerDirectives(path.node); + if (shouldSkip(path)) { path.skip(); } else { @@ -149,7 +156,11 @@ export const transformBabel: AstTransformer = ( function* mutate(node: NodePath): Iterable { for (const mutator of mutators) { for (const replacement of mutator.mutate(node)) { - yield { replacement, mutatorName: mutator.name, ignoreReason: formatIgnoreReason(mutator.name) }; + yield { + replacement, + mutatorName: mutator.name, + ignoreReason: directiveBookkeeper.findIgnoreReason(node.node.loc!.start.line, mutator.name) ?? formatIgnoreReason(mutator.name), + }; } } diff --git a/packages/instrumenter/src/transformers/directive-bookkeeper.ts b/packages/instrumenter/src/transformers/directive-bookkeeper.ts new file mode 100644 index 0000000000..c62af41f06 --- /dev/null +++ b/packages/instrumenter/src/transformers/directive-bookkeeper.ts @@ -0,0 +1,92 @@ +import { types } from '@babel/core'; +import { notEmpty } from '@stryker-mutator/util'; + +const WILDCARD = 'all'; +const DEFAULT_REASON = 'Ignored using a comment'; + +type IgnoreReason = string | undefined; + +interface Rule { + findIgnoreReason(mutatorName: string, line: number): IgnoreReason; +} + +class IgnoreRule implements Rule { + constructor(public mutatorNames: string[], public line: number | undefined, public ignoreReason: IgnoreReason, public previousRule: Rule) {} + + private matches(mutatorName: string, line: number): boolean { + const lineMatches = () => this.line === undefined || this.line === line; + const mutatorMatches = () => this.mutatorNames.includes(mutatorName) || this.mutatorNames.includes(WILDCARD); + return lineMatches() && mutatorMatches(); + } + + public findIgnoreReason(mutatorName: string, line: number): IgnoreReason { + if (this.matches(mutatorName, line)) { + return this.ignoreReason; + } + return this.previousRule.findIgnoreReason(mutatorName, line); + } +} + +class RestoreRule extends IgnoreRule { + constructor(mutatorNames: string[], line: number | undefined, previousRule: Rule) { + super(mutatorNames, line, undefined, previousRule); + } +} + +const rootRule: Rule = { + findIgnoreReason() { + return undefined; + }, +}; + +/** + * Responsible for the bookkeeping of "// Stryker" directives like "disable" and "restore". + */ +export class DirectiveBookkeeper { + // https://regex101.com/r/nWLLLm/1 + private readonly strykerCommentDirectiveRegex = /^\s?Stryker (disable|restore)(?: (next-line))? ([a-zA-Z, ]+)(?::(.+)?)?/; + + private currentIgnoreRule = rootRule; + + public processStrykerDirectives({ loc, leadingComments }: types.Node): void { + leadingComments + ?.map( + (comment) => + this.strykerCommentDirectiveRegex.exec(comment.value) as + | [fullMatch: string, directiveType: string, scope: string | undefined, mutators: string, reason: string | undefined] + | null + ) + .filter(notEmpty) + .forEach(([, directiveType, scope, mutators, optionalReason]) => { + const mutatorNames = mutators.split(',').map((mutator) => mutator.trim().toLowerCase()); + const reason = (optionalReason ?? DEFAULT_REASON).trim(); + switch (directiveType) { + case 'disable': + switch (scope) { + case 'next-line': + this.currentIgnoreRule = new IgnoreRule(mutatorNames, loc!.start.line, reason, this.currentIgnoreRule); + break; + default: + this.currentIgnoreRule = new IgnoreRule(mutatorNames, undefined, reason, this.currentIgnoreRule); + break; + } + break; + case 'restore': + switch (scope) { + case 'next-line': + this.currentIgnoreRule = new RestoreRule(mutatorNames, loc!.start.line, this.currentIgnoreRule); + break; + default: + this.currentIgnoreRule = new RestoreRule(mutatorNames, undefined, this.currentIgnoreRule); + break; + } + break; + } + }); + } + + public findIgnoreReason(line: number, mutatorName: string): string | undefined { + mutatorName = mutatorName.toLowerCase(); + return this.currentIgnoreRule.findIgnoreReason(mutatorName, line); + } +} diff --git a/packages/instrumenter/test/integration/instrumenter.it.spec.ts b/packages/instrumenter/test/integration/instrumenter.it.spec.ts index b2ed9383e3..05396bb5a7 100644 --- a/packages/instrumenter/test/integration/instrumenter.it.spec.ts +++ b/packages/instrumenter/test/integration/instrumenter.it.spec.ts @@ -45,8 +45,11 @@ describe('instrumenter integration', () => { it('should be able to instrument js files with a shebang in them', async () => { await arrangeAndActAssert('shebang.js'); }); - it('should not place ignored mutants', async () => { - await arrangeAndActAssert('ignore.js', createInstrumenterOptions({ excludedMutations: ['ArithmeticOperator'] })); + it('should not place excluded mutations', async () => { + await arrangeAndActAssert('excluded-mutations.js', createInstrumenterOptions({ excludedMutations: ['ArithmeticOperator'] })); + }); + it('should not place disabled mutants', async () => { + await arrangeAndActAssert('disabled.js'); }); it('should be able to instrument switch case statements (using the switchCaseMutantPlacer)', async () => { await arrangeAndActAssert('switch-case.js'); diff --git a/packages/instrumenter/test/unit/transformers/babel-transformer.spec.ts b/packages/instrumenter/test/unit/transformers/babel-transformer.spec.ts index 59cb5a2bf6..bac0a56aa8 100644 --- a/packages/instrumenter/test/unit/transformers/babel-transformer.spec.ts +++ b/packages/instrumenter/test/unit/transformers/babel-transformer.spec.ts @@ -27,7 +27,7 @@ describe('babel-transformer', () => { let mutantCollector: MutantCollector; const fooMutator: NodeMutator = { - name: 'foo', + name: 'Foo', *mutate(path) { if (path.isIdentifier() && path.node.name === 'foo') { yield types.identifier('bar'); @@ -35,7 +35,7 @@ describe('babel-transformer', () => { }, }; const plusMutator: NodeMutator = { - name: 'plus', + name: 'Plus', *mutate(path) { if (path.isBinaryExpression() && path.node.operator === '+') { yield types.binaryExpression('-', types.cloneNode(path.node.left, true), types.cloneNode(path.node.right, true)); @@ -68,9 +68,9 @@ describe('babel-transformer', () => { act(ast); expect(mutantCollector.mutants).lengthOf(2); expect(mutantCollector.mutants[0].replacementCode).eq('bar'); - expect(mutantCollector.mutants[0].mutatorName).eq('foo'); + expect(mutantCollector.mutants[0].mutatorName).eq('Foo'); expect(mutantCollector.mutants[1].replacementCode).eq('bar - baz'); - expect(mutantCollector.mutants[1].mutatorName).eq('plus'); + expect(mutantCollector.mutants[1].mutatorName).eq('Plus'); expect(normalizeWhitespaces(generator(ast.root).code)).contains('{ bar = bar + baz; foo = bar - baz; foo = bar + baz; }'); }); @@ -99,31 +99,31 @@ describe('babel-transformer', () => { const ast = createJSAst({ rawContent: 'foo("bar")' }); // Act - expect(() => act(ast)).throws('example.js:1:0 brokenPlacer could not place mutants with type(s): "foo".'); + expect(() => act(ast)).throws('example.js:1:0 brokenPlacer could not place mutants with type(s): "Foo".'); }); }); describe('excluded mutations', () => { it('should not place mutants that are ignored', () => { const ast = createJSAst({ rawContent: 'foo = bar + baz;' }); - context.options.excludedMutations = ['foo']; + context.options.excludedMutations = ['Foo']; act(ast); const result = normalizeWhitespaces(generator(ast.root).code); expect(result).not.include('bar = bar + baz;'); }); it('should still place other mutants', () => { const ast = createJSAst({ rawContent: 'foo = bar + baz;' }); - context.options.excludedMutations = ['foo']; + context.options.excludedMutations = ['Foo']; act(ast); const result = normalizeWhitespaces(generator(ast.root).code); expect(result).include('foo = bar - baz'); }); it('should collect ignored mutants with correct ignore message', () => { const ast = createJSAst({ rawContent: 'foo' }); - context.options.excludedMutations = ['foo']; + context.options.excludedMutations = ['Foo']; act(ast); expect(mutantCollector.mutants).lengthOf(1); - expect(mutantCollector.mutants[0].ignoreReason).eq('Ignored because of excluded mutation "foo"'); + expect(mutantCollector.mutants[0].ignoreReason).eq('Ignored because of excluded mutation "Foo"'); }); }); @@ -171,6 +171,375 @@ describe('babel-transformer', () => { }); }); + describe('with directive', () => { + function notIgnoredMutants() { + return mutantCollector.mutants.filter((mutant) => !mutant.ignoreReason); + } + function ignoredMutants() { + return mutantCollector.mutants.filter((mutant) => Boolean(mutant.ignoreReason)); + } + + describe('"Stryker disable next-line"', () => { + it('should ignore all mutants with the leading comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line all + const foo = 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(0); + }); + + it('should ignore mutants that spawn multiple lines', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line all + const foo = 1 + + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(0); + }); + + it('should be supported in the middle of a function call', () => { + const ast = createTSAst({ + rawContent: ` + console.log( + // Stryker disable next-line plus + 1 + 1 + ); + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(0); + }); + + it('should only ignore a single line', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line all + let foo = 1 + 1; + foo = 1 + 1; + `, + }); + act(ast); + expect(ignoredMutants()).lengthOf(2); + expect(ignoredMutants().map((mutant) => mutant.original.loc!.start.line)).deep.eq([3, 3]); + expect(notIgnoredMutants()).lengthOf(2); + expect(notIgnoredMutants().map((mutant) => mutant.original.loc!.start.line)).deep.eq([4, 4]); + }); + + it('should ignore a mutant when lead with a "Stryker disable next-line mutator" comment targeting that mutant', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line plus + const foo = 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(1); + expect(ignoredMutants()).lengthOf(1); + const ignoredMutant = ignoredMutants()[0]; + expect(ignoredMutant.mutatorName).eq('Plus'); + }); + + it('should ignore mutants when lead with a "Stryker disable next-line mutator" comment targeting with multiple mutators', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line plus,foo + const foo = 1 + 1; + `, + }); + act(ast); + expect(ignoredMutants()).lengthOf(2); + }); + + it('should ignore mutants when lead with multiple "Stryker disable next-line mutator" comments spread over multiple lines', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line plus + // Stryker disable next-line foo + const foo = 1 + 1; + `, + }); + act(ast); + expect(ignoredMutants()).lengthOf(2); + }); + + it('should ignore mutants when lead with a "Stryker disable next-line all" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line all + const foo = 1 + 1; + `, + }); + act(ast); + expect(ignoredMutants()).lengthOf(2); + }); + + it('should allow users to add an ignore reasons', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line foo: I don't like foo + const foo = "bar"; + `, + }); + act(ast); + expect(mutantCollector.mutants[0].ignoreReason).to.equal("I don't like foo"); + }); + + it('should allow multiple user comments for one line', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable next-line foo: I don't like foo + // Stryker disable next-line plus: I also don't like plus + const foo = 1 + 1; + `, + }); + act(ast); + expect(mutantCollector.mutants.find((mutant) => mutant.mutatorName === 'Foo')?.ignoreReason).to.equal("I don't like foo"); + expect(mutantCollector.mutants.find((mutant) => mutant.mutatorName === 'Plus')?.ignoreReason).to.equal("I also don't like plus"); + }); + }); + + describe('"Stryker disable"', () => { + it('should ignore all following mutants', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + const a = 1 + 1; + const b = 1 + 1; + const c = 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(0); + expect(ignoredMutants()).lengthOf(3); + }); + + it('should not ignore all mutants following a "Stryker restore" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + const a = 1 + 1; + const b = 1 + 1; + const c = 1 + 1; + // Stryker restore all + + const foo = 'a'; + `, + }); + act(ast); + expect(ignoredMutants()).lengthOf(3); + expect(notIgnoredMutants()).lengthOf(1); + const notIgnoredMutant = notIgnoredMutants()[0]; + expect(notIgnoredMutant.mutatorName).eq('Foo'); + }); + + it('should ignore all mutants, even if some where explicitly disabled with a "Stryker disable next-line" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + a = 1 + 1; + // Stryker disable next-line Foo: with a custom reason + foo = 1 + 1; + c = 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(0); + expect(ignoredMutants()).lengthOf(4); + }); + + it('should allow an ignore reason', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all: Disable everything + // Stryker disable foo: But have a reason for disabling foo + const a = 1 + 1; + const b = 1 + 1; + const c = 1 + 1; + const foo = 'a'; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(0); + expect( + mutantCollector.mutants.filter((mutant) => mutant.mutatorName === 'Plus').every((mutant) => mutant.ignoreReason === 'Disable everything') + ).to.be.true; + expect(mutantCollector.mutants.find((mutant) => mutant.mutatorName === 'Foo')!.ignoreReason).to.equal('But have a reason for disabling foo'); + }); + + it('should be able to restore a specific mutator that was previously explicitly disabled', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable foo,plus + const a = 1 + 1; + const b = 1 + 1; + const c = 1 + 1; + // Stryker restore foo + const foo = 'a'; + const d = 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(1); + expect(notIgnoredMutants()[0].mutatorName).eq('Foo'); + }); + + it('should be able to restore a specific mutator after all mutators were disabled', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + const a = 1 + 1; + const b = 1 + 1; + const c = 1 + 1; + // Stryker restore foo + const foo = 'a'; + const d = 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(1); + expect(notIgnoredMutants()[0].mutatorName).eq('Foo'); + }); + + it('should restore all mutators following a "Stryker restore" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable foo,plus + const a = 1 + 1; + const b = 1 + 1; + const c = 1 + 1; + // Stryker restore all + const foo = 'a'; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(1); + expect(notIgnoredMutants()[0].original.loc!.start.line).eq(7); + }); + + it('should restore a specific mutators when using a "Stryker restore mutant" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + const a = 1 + 1; + const b = 1 + 1; + const c = 1 + 1; + // Stryker restore foo + const foo = 'a'; + const d = 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(1); + }); + + it('should allow to restore for next-line using a specific "Stryker restore next-line mutator" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + 1 + 1; + // Stryker restore next-line plus + 1 + foo; + 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(1); + expect(ignoredMutants()).lengthOf(3); + const actualNotIgnoredMutant = notIgnoredMutants()[0]; + expect(actualNotIgnoredMutant.mutatorName).eq('Plus'); + expect(actualNotIgnoredMutant.original.loc!.start.line).eq(5); + }); + + it('should allow multiple restore for next-line using a specific "Stryker restore next-line mutator" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + 1 + 1; + // Stryker restore next-line plus + // Stryker restore next-line foo + 1 + foo; + 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(2); + expect(ignoredMutants()).lengthOf(2); + const [actualRestoredMutantPlus, actualRestoredMutantFoo] = notIgnoredMutants(); + expect(actualRestoredMutantPlus.mutatorName).eq('Plus'); + expect(actualRestoredMutantPlus.original.loc!.start.line).eq(6); + expect(actualRestoredMutantFoo.mutatorName).eq('Foo'); + expect(actualRestoredMutantFoo.original.loc!.start.line).eq(6); + }); + + it('should allow to restore for next-line using a "Stryker restore next-line all" comment', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + 1 + 1; + // Stryker restore next-line all + 1 + foo; + 1 + 1; + `, + }); + act(ast); + expect(notIgnoredMutants()).lengthOf(2); + expect(ignoredMutants()).lengthOf(2); + const actualNotIgnoredPlusMutant = notIgnoredMutants()[0]; + const actualNotIgnoredFooMutant = notIgnoredMutants()[1]; + expect(actualNotIgnoredPlusMutant.mutatorName).eq('Plus'); + expect(actualNotIgnoredPlusMutant.original.loc!.start.line).eq(5); + expect(actualNotIgnoredFooMutant.mutatorName).eq('Foo'); + expect(actualNotIgnoredFooMutant.original.loc!.start.line).eq(5); + }); + + it('should allow disable, restore mutator, disable all', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable all + 1 + 1; + // Stryker restore plus + 1 + 1; + // Stryker disable all + 1 + 1; + `, + }); + act(ast); + + expect(notIgnoredMutants()).lengthOf(1); + expect(ignoredMutants()).lengthOf(2); + const actualNotIgnoredFooMutant = notIgnoredMutants()[0]; + expect(actualNotIgnoredFooMutant.mutatorName).eq('Plus'); + expect(actualNotIgnoredFooMutant.original.loc!.start.line).eq(5); + }); + + it('should allow disable mutator, restore all, disable mutator', () => { + const ast = createTSAst({ + rawContent: ` + // Stryker disable plus + 1 + 1; + // Stryker restore all + 1 + 1; + // Stryker disable plus + 1 + 1; + `, + }); + act(ast); + + expect(notIgnoredMutants()).lengthOf(1); + expect(ignoredMutants()).lengthOf(2); + const actualNotIgnoredFooMutant = notIgnoredMutants()[0]; + expect(actualNotIgnoredFooMutant.mutatorName).eq('Plus'); + expect(actualNotIgnoredFooMutant.original.loc!.start.line).eq(5); + }); + }); + }); + describe('with mutationRanges', () => { let ast: ScriptAst; diff --git a/packages/instrumenter/testResources/instrumenter/disabled.js b/packages/instrumenter/testResources/instrumenter/disabled.js new file mode 100644 index 0000000000..f073fa4193 --- /dev/null +++ b/packages/instrumenter/testResources/instrumenter/disabled.js @@ -0,0 +1,14 @@ +function factorial (num) { + if (typeof (num) !== 'number') throw new Error("Input must be a number."); + if (num < 0) throw new Error("Input must not be negative."); + var i = 2, + o = 1; + + // Stryker disable next-line BlockStatement: Infinite loop + while (i <= num) { + // Stryker disable next-line UpdateOperator: Infinite loop + o *= i++; + } + + return o; +}; diff --git a/packages/instrumenter/testResources/instrumenter/disabled.js.out.snap b/packages/instrumenter/testResources/instrumenter/disabled.js.out.snap new file mode 100644 index 0000000000..273389f4d3 --- /dev/null +++ b/packages/instrumenter/testResources/instrumenter/disabled.js.out.snap @@ -0,0 +1,86 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`instrumenter integration should not place disabled mutants 1`] = ` +"function stryNS_9fa48() { + var g = new Function(\\"return this\\")(); + var ns = g.__stryker__ || (g.__stryker__ = {}); + + if (ns.activeMutant === undefined && g.process && g.process.env && g.process.env.__STRYKER_ACTIVE_MUTANT__) { + ns.activeMutant = g.process.env.__STRYKER_ACTIVE_MUTANT__; + } + + function retrieveNS() { + return ns; + } + + stryNS_9fa48 = retrieveNS; + return retrieveNS(); +} + +stryNS_9fa48(); + +function stryCov_9fa48() { + var ns = stryNS_9fa48(); + var cov = ns.mutantCoverage || (ns.mutantCoverage = { + static: {}, + perTest: {} + }); + + function cover() { + var c = cov.static; + + if (ns.currentTestId) { + c = cov.perTest[ns.currentTestId] = cov.perTest[ns.currentTestId] || {}; + } + + var a = arguments; + + for (var i = 0; i < a.length; i++) { + c[a[i]] = (c[a[i]] || 0) + 1; + } + } + + stryCov_9fa48 = cover; + cover.apply(null, arguments); +} + +function stryMutAct_9fa48(id) { + var ns = stryNS_9fa48(); + + function isActive(id) { + if (ns.activeMutant === id) { + if (ns.hitCount !== void 0 && ++ns.hitCount > ns.hitLimit) { + throw new Error('Stryker: Hit count limit reached (' + ns.hitCount + ')'); + } + + return true; + } + + return false; + } + + stryMutAct_9fa48 = isActive; + return isActive(id); +} + +function factorial(num) { + if (stryMutAct_9fa48(\\"0\\")) { + {} + } else { + stryCov_9fa48(\\"0\\"); + if (stryMutAct_9fa48(\\"3\\") ? typeof num === 'number' : stryMutAct_9fa48(\\"2\\") ? false : stryMutAct_9fa48(\\"1\\") ? true : (stryCov_9fa48(\\"1\\", \\"2\\", \\"3\\"), typeof num !== (stryMutAct_9fa48(\\"4\\") ? \\"\\" : (stryCov_9fa48(\\"4\\"), 'number')))) throw new Error(stryMutAct_9fa48(\\"5\\") ? \\"\\" : (stryCov_9fa48(\\"5\\"), \\"Input must be a number.\\")); + if (stryMutAct_9fa48(\\"9\\") ? num >= 0 : stryMutAct_9fa48(\\"8\\") ? num <= 0 : stryMutAct_9fa48(\\"7\\") ? false : stryMutAct_9fa48(\\"6\\") ? true : (stryCov_9fa48(\\"6\\", \\"7\\", \\"8\\", \\"9\\"), num < 0)) throw new Error(stryMutAct_9fa48(\\"10\\") ? \\"\\" : (stryCov_9fa48(\\"10\\"), \\"Input must not be negative.\\")); + var i = 2, + o = 1; // Stryker disable next-line BlockStatement: Infinite loop + + while (stryMutAct_9fa48(\\"13\\") ? i > num : stryMutAct_9fa48(\\"12\\") ? i < num : stryMutAct_9fa48(\\"11\\") ? false : (stryCov_9fa48(\\"11\\", \\"12\\", \\"13\\"), i <= num)) { + // Stryker disable next-line UpdateOperator: Infinite loop + o *= i++; + } + + return o; + } +} + +;" +`; diff --git a/packages/instrumenter/testResources/instrumenter/ignore.js b/packages/instrumenter/testResources/instrumenter/excluded-mutations.js similarity index 100% rename from packages/instrumenter/testResources/instrumenter/ignore.js rename to packages/instrumenter/testResources/instrumenter/excluded-mutations.js diff --git a/packages/instrumenter/testResources/instrumenter/ignore.js.out.snap b/packages/instrumenter/testResources/instrumenter/excluded-mutations.js.out.snap similarity index 94% rename from packages/instrumenter/testResources/instrumenter/ignore.js.out.snap rename to packages/instrumenter/testResources/instrumenter/excluded-mutations.js.out.snap index 3867747dae..015222ace2 100644 --- a/packages/instrumenter/testResources/instrumenter/ignore.js.out.snap +++ b/packages/instrumenter/testResources/instrumenter/excluded-mutations.js.out.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`instrumenter integration should not place ignored mutants 1`] = ` +exports[`instrumenter integration should not place excluded mutations 1`] = ` "function stryNS_9fa48() { var g = new Function(\\"return this\\")(); var ns = g.__stryker__ || (g.__stryker__ = {});