From cb7efb796f4956cedb4e36c3b372378a56e949c5 Mon Sep 17 00:00:00 2001 From: G0lge Date: Sun, 7 Apr 2024 16:11:47 +0300 Subject: [PATCH] readme update, bugfix etc. --- README.md | 63 +++++----- images/Original_Asm_Code.png | Bin 17032 -> 0 bytes images/Original_Cpp_Code.png | Bin 6505 -> 0 bytes images/adjusted.png | Bin 7435 -> 0 bytes images/calling_convention.png | Bin 21167 -> 0 bytes images/decomp.png | Bin 4111 -> 0 bytes images/decomp2.png | Bin 7066 -> 0 bytes images/disass.png | Bin 11778 -> 0 bytes images/graph.png | Bin 0 -> 42865 bytes images/mergen_dec.png | Bin 0 -> 7562 bytes images/mergen_disass.png | Bin 0 -> 6462 bytes images/mergen_run.png | Bin 10427 -> 0 bytes images/org_decomp.png | Bin 0 -> 3059 bytes images/org_disass.png | Bin 0 -> 9786 bytes images/run_mergen.PNG | Bin 0 -> 10475 bytes images/running_mergen.png | Bin 14388 -> 0 bytes images/vmp_settings.png | Bin 8791 -> 0 bytes images/vmp_settings1.png | Bin 0 -> 14524 bytes images/vmp_settings2.png | Bin 10873 -> 8533 bytes images/vmp_ultra_asm.png | Bin 18922 -> 0 bytes lifter/OperandUtils.cpp | 220 +++++++++++++++++++++++----------- lifter/Semantics.cpp | 215 ++++++++++++++++++--------------- lifter/includes.h | 2 +- lifter/lifter.cpp | 2 +- 24 files changed, 301 insertions(+), 201 deletions(-) delete mode 100644 images/Original_Asm_Code.png delete mode 100644 images/Original_Cpp_Code.png delete mode 100644 images/adjusted.png delete mode 100644 images/calling_convention.png delete mode 100644 images/decomp.png delete mode 100644 images/decomp2.png delete mode 100644 images/disass.png create mode 100644 images/graph.png create mode 100644 images/mergen_dec.png create mode 100644 images/mergen_disass.png delete mode 100644 images/mergen_run.png create mode 100644 images/org_decomp.png create mode 100644 images/org_disass.png create mode 100644 images/run_mergen.PNG delete mode 100644 images/running_mergen.png delete mode 100644 images/vmp_settings.png create mode 100644 images/vmp_settings1.png delete mode 100644 images/vmp_ultra_asm.png diff --git a/README.md b/README.md index 71ebc0f..5e9a628 100644 --- a/README.md +++ b/README.md @@ -13,59 +13,64 @@ This tool is designed for: ### Optimization ## Diagram -![image](https://github.com/loneicewolf/Mergen/assets/68499986/d557b048-9c77-49f2-82b2-ef299bc783c8) +![image](images/graph.png) ## Example This is our target program ```cpp -int maths(int a, int b, int c) { - return a + b - c; +struct test { + int a; + int b; + int c; +}; + +int maths(test a, int b, int c) { + return a.a + b - c; } ``` -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/Original_Asm_Code.png) +![image](images/org_disass.png) -VMProtect settings, everything is turned off, we virtualize the function on ultra setting. (Tested versions 3.4.0-3.6.0) +![image](images/org_decomp.png) -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/vmp_settings.png) +VMProtect settings, everything is turned off, we virtualize the function on ultra setting. (Tested versions 3.4.0-3.6.0 3.8.1) -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/vmp_settings2.png) +![image](images/vmp_settings1.png) -This is how it looks after virtualizing. - -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/vmp_ultra_asm.png) +![image](images/vmp_settings2.png) Here, we run mergen. First argument is the name of the file and the second argument is the address of the function. Look how simple it is to run. And we can compile the output so we can explore it using our favorite decompiler. -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/mergen_run.png) +![image](images/run_mergen.png) ```llvm ; ModuleID = 'my_lifting_module' source_filename = "my_lifting_module" -; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) -define i64 @main(i64 %rax, i64 %rcx, i64 %rdx, i64 %rbx, i64 %0, i64 %rbp, i64 %rsi, i64 %rdi, i64 %r8, i64 %r9, i64 %r10, i64 %r11, i64 %r12, i64 %r13, i64 %r14, i64 %r15, ptr nocapture readnone %memory) local_unnamed_addr #0 { +; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) +define i64 @main(i64 %rax, i64 %rcx, i64 %rdx, i64 %rbx, i64 %0, i64 %rbp, i64 %rsi, i64 %rdi, i64 %r8, i64 %r9, i64 %r10, i64 %r11, i64 %r12, i64 %r13, i64 %r14, i64 %r15, ptr nocapture readonly %memory) local_unnamed_addr #0 { entry: - %stackmemory = alloca i128, i128 20971520, align 8 + %stackmemory = alloca i128, i128 13758960, align 8 %1 = trunc i64 %r8 to i32 %2 = trunc i64 %rdx to i32 - %3 = trunc i64 %rcx to i32 - %realadd-5369234850- = add i32 %2, %3 - %not17196 = sub i32 %realadd-5369234850-, %1 - %4 = zext i32 %not17196 to i64 - ret i64 %4 + %GEPLoadxd-5369456437- = getelementptr i8, ptr %memory, i64 %rcx + %3 = load i32, ptr %GEPLoadxd-5369456437-, align 4 + %adc-temp-5370242400- = sub i32 %2, %1 + %realnot-5369532059- = add i32 %adc-temp-5370242400-, %3 + %stackmemory10243.sroa.55.1375304.insert.ext10255 = zext i32 %realnot-5369532059- to i64 + ret i64 %stackmemory10243.sroa.55.1375304.insert.ext10255 } -attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ``` After compiling: -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/disass.png) +![image](images/mergen_disass.png) -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/decomp.png) +![image](images/mergen_dec.png) Now you might notice the registers are a little bit off. This is because of we dont follow the calling conventions, if we were to follow the calling conventions, function signature would look like this: ```llvm @@ -73,20 +78,14 @@ define i64 @main(i64 %rcx, i64 %rdx, i64 %rdx, i64 %r8, i64 %r9 ...) ``` So, we just adjust the function signature to look normally. If you have more questions about this part, I suggest you research [calling conventions](https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170#parameter-passing) and [ABI](https://learn.microsoft.com/en-us/cpp/build/x64-software-conventions?view=msvc-170&source=recommendations#register-volatility-and-preservation). -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/decomp2.png) -![image](https://raw.githubusercontent.com/NaC-L/Mergen/main/images/adjusted.png) +## Current problems -## What it can/cant do +### Automatically exploring branches and merging two paths into one program -### It can devirtualize some versions of some programs. - -### It can figure out if `jcc` is opaque. - -### It cant decide which path to follow if `jcc` is not opaque. - -### It cant optimize whole binary, only one function at a time. +### Some optimization stuff +### ABI stuff # Getting in touch diff --git a/images/Original_Asm_Code.png b/images/Original_Asm_Code.png deleted file mode 100644 index 347352ea2f7f8bacb7accb1456d3f66b331123fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17032 zcmeIZg1iH-x0-@mEy9GR> zYk;2w{6KM3krV-yd?Q%}{y;SqmKO$rK1JNWfZYN92HQz#JAy!1ZOAW_PTRa!Adm>D zw3x7(oBrm$Whrz4u#nGR)hKvCtmAW{Lv!ui$zET^7Yu{R`ggfs-l1+1&yYMvJ@F~}ENlLGd8T(k@Xht~`Yr|L8@IC$ zN2EWC9{RDHo5`~(3Vk$A;mDX-DjQBxozhW`A|U>A(qSPRDgz1&UdmoC&@B^5*-e#H_SUJxa}#pb8bruPJ= zr&5Qf`=B^`cSS>B?I|07{<>+R#TO?B!isQQ%+3$DN|anZ8{QSZ7;xg-a*XkOyE|+9 zt4?%}w&{#XCq*#pK8sr&UK8)3D?*L3TmVY?fjIO;blNu3q+ju%sP(o7cgmai`mhpJ zSK@VC8Cdq+Hlj+P} zhfn?4NBBK{+u^J`!xX1WyaDy|JfefoLV}XiK%8Ol4{$-C{INCgDjHqW`)nD|!?qr?2y|TF2+;lC_L38)| zQmE-VqxC9yveP)oHgaV^5ameBE%xW(T-J7Y{TwDF$9BZv3g;(5b}CEW^$!M}qQ~R~ z-d~dnW4d81-JXJkB;gf}rSm47Fjc`o_~lVQD=X~}uhT0kxUat!Tm9E&FIneTjI1nU z)xlgBm$uEdgU#O8>peX}J&|-$Hc2Y12X#*d9NnZ4h>5Voz>x1>gbLuR-i)1Z*Ciu7 z5jQBL*yZaLdbL~prAF$&Fcs90`6P*WWyWtW(cqM~)Uum+;fHs)-`P*;Ys~rM!>5P9 z2Rn)|*!#*ASvJQ_I#>|Y^31~n+#|T4%oSXc#tS)+f^L+qQg4UKOqpdD<%#=?P4c@? z2W7meo2~6X4Eh=0k+BhaP*9yYa{pvgm-w0+qH!7c@!W7w(Sk9NI26McRQ1$4a)rn9 z*2XU~~PVdH&yCD5Cv?YXLYWZfgM zkhZR>zWOGiGpbL4pS?0qAF&}9Xg_lylF_9GSrWS1aMb?!)6vg?P>TE`I3HI=)+0nr zaShk-;Yy*JZT-MYMEaD^VmO&W+h&M{?b<2Ubkkiw^u~!E!FRGn^tNy76UCsJYSq^k z=;y$P_YU`ky_mFCLZ!Xid8gIzby}BS zGCvYWFVI<(>-HeMn!VpB$;76bmkg!&<}+mzQoXz1`Jepob}E-a$dGQcdun1%sxK1c z(7;&xqT4S^`rE}A6;<^l2hERWUmZ&6KC-rwChnLs=QXJKM3)&`>{K@@r6m)y{P-WUOY%NkzjE9>ThLw|?%DyQItN%7DZ{iaf^@bd?fR9c0nCBB;<{j&rqZ!( z;r8jnX-xfwzTh;eHX*NQboa3u8cMF~ZEpl?xsp<3Pv$V?SD(|s1-ZyURSu%jAnMGrebX!FCZWM30&RcS$c?zwhuoI zOuPEPU_48vx_-Z@KMBJ5MfJN=0jD^^wSco5B?GqY*emRLHk_6D+{O3)rjF*M( zS+_pygulD|@k8~f;@8Dqr#CTb1%6$Mf4aWZ50#nEnA_M`o#xJ2BAzZUFUnLYr4I!m z8XuKA4nJ6i2UKzi*2A6md1X}Mqz;N@5W(bAvl7p$_DlDg>!d3)l+>V0pP@{~4@>&t z*@M+NV>xnEy0L|;CYmaX8%Z438VY^K)lb3E*qp8zTcnJ(t0&L6<|}QRyolx$6%wsW!DWn;m~bCkLu);^XTXx`fYP4qtRU3YxFf zV2}G*jSUpla3lM?^Hf>3^&~lAM8j7bgTT3drw?ArHl&N8c{pS?*0gWy{;VU9!9+z>+YNK-;cV zu&<g{yTUS zRJWV^C~-r-)rx>}GqVk15QkQ*q2nL=E!g2Zll6EmYAO?qMfqg1i5gu)r(CyxknQ6n zK6t2NCDGKK2WT+fF1AGlubZAU%u@9q-)fOGbnBT(zst`L-45S*&=6N<*VFtA7p);f zxt{bb9Hph>#5{NA>RqaT+w2Q6QV8UT!-Wwxw@QX~H1`|UEtdngps`ImB^lxC5Su*or2Ct6G#D0 z7j3zIFM78^3;O)qxOP7Xz-yz=P=OuH@|$sUAd#CCt6!%KzmTtag>by_$}q(w1Gc4! z_qMM4=7~YTRp^W#h&kdaJ37aXc`%6NGY*S5Lkv71|O}b>a<3Wf^j8+$To3j z_xH|M?c84vY}%a(bZo&SAvw9j-oyM~`iFW}747-1Wif7noFGf1?wZ+U)2qVvi4HHm zN6mlwvk|8z?C%~pTs(3iSBvjwf?YfCe^l`J3sj^>J`g4a$HHMaUy|UUW+lPp0b$XgVdR-399nLr% zFRw0+dF#|Bf_Ct6bm{8f-w_KHiTQ=sXk?>=b-Rv@(pkhDNpz$EGy&)GT9`;@seK*J z5aSuF5YN>Xc%9S5%kzO%9V<)Mi_1B0y?t<4v%5F|8fYQ@gogRBUUQ0$IKw^4g>%Ib zrT9_Rz_Cywn3%dgZ2yC4B#14|oy43bod`$J4Tz7 ziuwMNKWg5 zMSj-h~_XKPR8Yt!Bxnd0)W)4Ffm3hPR>3j+R zK8Aw-Tdf&Bt7rI9(VSi-p8DgL_Zl&%3H2jfpq6QrpcRj_7@YOD0B>ALRmmw`6Qbnj zi(=C|E4t2m9lFya-bV?mw<}~Oi;K4vM}V40!r*mPKh^22T-}wDb4VUmF1RrvVQrkY zg|>s$h~XUj;`4%O9Gf!Z0Mj8GEo|#Jq zQ|T`MqT60^bw9OJP_U{_SX=Qx>W}UvjoxkCX$fYSkm6~4qqV@L5*}187=bYX6q*PR z$iw6dK`_fJ6r9Wl+1z(Z6NqElp0k8XeN@uJ{SYe1X)ygFQ&vr`c{op#WJn?=qyUk{BS`EcpWO|*EOON zO%Yonb)C+rp8CtZoVf`n0D*^gFz+Pz(Ez(M)kG*&5rGiX^qNfwdC%s<8kpcWc1Jk~ z3bDY~c*14IWF8h#y6s5FktnvFgzX19e?CG zyxoy!t!cmS{5l97iZN@66v(qmJoMcZ zd(o-eo-8bkM4*;8Ks)!zj4E@y$Qh$W1sc^U(86ZBun(N>4;dC1@kCVmZF=o`=P(YgY@oe#;bn z6nlA!m`ll)`Sv3Q`{DlkvO-FjxT7Bq zX02$eMFYS*Qif<-JT7=oPCH5&mzskOwfH}qIOmtCoK6}QSHY!!R9-cr_mlR7YFE?- zu{qz0dHCL$)A5ep^i|A!SIwkg{C8(Y1@j=R8arP~Q-Fb~E8;@vPf8|mHA9)inglSlGCP@Aey zs8W=j7C&&1sFI_G0ja_pol zr`{Lqzwfq7B&(IQVuJP*wxnBNwN4ccOwd8LpbBUT-lMFpI0@4R#7!Hv_P z6izpvRqm<+Qv@$~$k3r`cmYy{b!SBOTXe9RXE3O{`ecg`U6pV#V(8S#OMt{X@zO&C zTu35I+aiJkLEHK8|JnP*|LlFjw#eS6pL)4>z#B6x@4wN(Z>8L?j#k0;B>_s^&2wIEwaBh{9cIvVxTL~jaK7N z)%S8%%udOfe`n=WI@|w0DMylWz1=^__S4d8SHT}VO(gm==E6zjrGfGLv`rZx^2mQ^ zdg@n=oh)YrTp4ikUo3R4ZZ0ks^W?+I7K@yJxrDNlH%?8~3Y|yPh{_BnFBL4=+UAOC zTDwW?h~t3Io%{IA;xD)_3rw6Z9!10&#Rd*-vlHO3yJx_SKUqpX0LaaeBo)l2*i{|< z$44@}T>8#C%sgaBI|uuyF4U}ZZj&yllncX!buT`z>BzDxk+{eltn-3AZ z;0?lCp!IZr8SY3+pzLR-W2l3J{WIt-yo)V7mw)&b#Ae6*Jp(0eQmDo9M;$P+0`0@Ski-?{Rlp29ByqCxlaGRi!9? z3&*2x(nOryH#%p~jlG>S$d3ma#~hiLdI}zSw^I`PvFKriZ#ixm!Y$2sH|-CNYB^P; zZXXG=L&-OcRev$q7+Du@MJXC@f*|`wW+#hypLt%;p5 zL+4h;?220?RFuDl6FKe}98S1fCsmYSK^XRo>#-GazNBme+~z;oOvupLw-ZL^{urQJVt!dsE{u~a)o23gwR+zjX z=wuimTV;$#OfcRtXY05%0t;}3cA-r@21t+@&^jBzdk0%b;B-uAk$bo4km2Ub&a&wh zg)Q@yeVS3wEN~PzP7Hu#03k~N0kY{&dgjtjH3R-Zo#b^X8((QS2lk1O`J0fPE55oh zX^O4&MY6$qg6j5i%o<)^0U)hznvZgbf zAI``E#Q3{%|71cST+bOD>GGSkkfLk+Xs?lS65X$#6aQlPi}k+oOcW_sE`FcYTWT=z z+5k1wJlBsgNpoaRdqsVPrpxdyoO;i|IgW-2+aTp&m6=~*T1#x~rCrJQ{4acL@7b!7 zRLLwHu((b*q&SOJbyPCQUNgeHNG}=>;!z_?r{|S~nw?kEGaB3mvv`6UsEf|IR9=)_ zJaZHH<$4`>+b0RfpKk5FfCz^u|2*ESm%p1CaZ5xBwO0h(?|D(n2$4Qo!$7dOALkJ*(D1aq}zS1U2$G~gX?}9&DTslT8Q%V zh1HzK`R}-)GK>8R+JX-+Avzn<@-&<(6hkS=@6IeMo;x)N#)dAFf%n_KtsZjBzdPhm zz0+5GZu13HW(k;NIS_JObwkRJmV!0tJTa6)97c`8`aZwH z^{eB@jr&9cdmx@WDwB|k*6{f?E6kl`HS2xZ=X6Mp2+sB|8W=s{uEWckogBoQPi(lO zpP8K9wCgDKwKH_vEo?%3Giah;emVyXl|u-DivNZF66LXU0z zI4h8b4l|Xj{Fa6~N$&e}sJvFZEY9DvF6ccgRrgPfk}78D3v1u}Rnr~(`Hqb>i&_bR z2TRD9Oqky>baj{kEL+d^KHU{o3>UXrqfhzzpIG%IONQ=pOmCVN_Os^6L+TB?gp6+> zJM0YHpA=tMqXhCSkT}KeK-&J7`KO!2NF=*>JBp|392}Vt`&8PClG$AqPc}*vPCExV7CADL59?42b2%V6siWqJU9Z3NrZI%&Uhxm2QJ0Hn zRQ1Vz)g*~Z@MiNVakimW%n5sbYHF`%aK*7wsZfj2yG;Agdee=CH3v0p(vD)v?uZ`|0y+BpfE6@cG9Z`>A2sZ3Q-%g@?Cud-enFI)sA|wB@JJkm7-~X%+%FV*R<0!6;c@@%6B*w(@PcY z-e#&}$NqM2R^cytJTDMPW_TS{exU`J2UT5i8$j?nRjtdLA(A1L`ya6fy>=Em= z4$68mKgT-*!L9~97LQ@|MpyLMoOLn89z+p+XR*v{;6MpT4NuFY7vqBD^rhbaLpi8So`l?`@ z6!ERtvf81G{u7=&qT`-_bb0Mg?8YRD^5JmxI*)*b1(GO*oB{oe3T!RJ4 z_R9Td(D7s5IZxpW$_f91fY@G4B3b?U`So)Wv@n{1;=VhZ6!;MUsp`4(66vMU z{brnTJNuG9$@xP^3y}w~dYSZ|H3Q6Q=#h+8g0b|mL$fWBQ`0e@T!cd=9L(#6%XCAo z>i>gW#pNycCQ=+jmT*}IU7;&0oz;2tQ*|gUP38cvDjwp9#tr%)JVK(l-%4{MlP#0t zm5zfZZXk=XP<$k^kOKjAk7-~QwZ0b>Q`j|{)xZF23QRV3lPDwafY6{~-_vC#D!eeH z(vZ=55Xm7LE2FNhQns2E$L6{=XNzxi7eZ1mzk0Z*PVcwIlo!wD+=(B7Rh(#@eb@VJ zuF)xGHAWPdAH(pvOp6gVW~UH)hTxQclH!{+)^UGH$dUg$Ax zfU~BecyRE7bsLyQ`Os7=uhS}hk<6!iX@ueBnBZXBlU#dQ#-cOzrqL;gm3c|d65IF_ zos}M~5q@TK4RzfuT*FfSJ=27Wf#!+Oj*%;RgdsBqXq+DKp6|?#JVkoXV!3~N&&4)2 z#g4tl0~AfMvir9VsB4$F-erB8+Z<;q;>B=zC!$@)5P$tT!@1A8<&yW)F5CEcI~K?V zApxmwH!yp4(r!8ZR4TMF$lTDzjOA`g{FzzHXTp-VJ6Cfw)1|9Kmqi0k2kKsIWK>&iW9hvml)O%U~C*K{FV z#VZ=05`Sc<+=0pJZU_d&n|_A-t5Gz^*WJ6hmVn$d`OkEd_-?9*UMlBdP0p9kMJADD zY20I+5~4sL6L)|M1ESlej(=^b-jUEFL9&C~IE|Pv3gsoCcth27{WaJX)&4mC7<(NILvZ`mRHC z7<9brb@%5N665CYiIa#VHImJ&3ZStSsPWpnPq1>eQ|G9`xWTu0hX$Q~0$Amkxj!Fu zsewRi({4$%cRd2+@7;_@w#!O|A-OJK4y`qfBm9g?g*fIbL6F9?<6^ybiX7qU#nzC{ zh1uAnpf^w^LVX3OuIgz4{M0^fspLnjU*Pd8CYZ>MZ`sK4bro3!3Ine_?^kbu9?H4? z`@X+c?hPe~MjKI%iV6)3m#ZMu9DliWb1G}gwdO?YAf`C6yzy}OkoMrCYT5W1gRE+D z$xfJIz#Ta4)esnZmH2Dw*uaK%d+tDMTtiyLxm}Ly=k=yaQ6Oq zek_aM^aZ>1XxUr1_}ft3oxBUeQQMw?RWc7i8Ij-mzo8Q!tO33a*ysQ{y)nx#w)Ul; z^j6YA5`Ht!K6^VctpN_3)nng_Gu^Q_-(OkFU(Tfs`w?4o?j`Dbrrr+dlQcywvn4xS z|2l#9cB3h`-$3$~2MG~)h+1-9Kr0L>_1eAuk$Uo+4?8B52|8UZ`{HL4#h0@ISXv>_ z5Xhd%Yz!W*lqh&{wH#D082A+!gsmyR-U$UA^&xSIT;W;m9j4)qwHl_I#cXOL2St=j z{vJ)&TT3C>#wh_NWzOyvacBTwQ>qQe0Da*PKJxmvlSh++fwiAb%`4^}wR+u?U1(mT z+=h)D?ST|*#*aXZ;!Yn>UGK*?T-I~eq)2i>+logY;L+Y7R8aAcPM-H{T@L(_ESLd<5aux+Kyf*M_XZ~n1{cq0xAt!Fztk22H z_ddO#+vZR!>aKg{mL1Xl`5%XL0;^?iubh)aC9Rxb1Ng)s;YLuWi9lB~LQ~f8jb^@d z$!chG75pS1`0`Ou(y4vkwAtd{5QR|M3l}YYMH1B<+Px?4SfTMZKq)JD`p{rJDvDOE zs203Ak%0FvoM#8eMxW^Fe)7Bbzivqr&`N+LPopnCfbS3Kgpju^Q}SX<15%Ipkmn0j zF7RVV>PWE=)i^c-%sn;Y*d@9QFVtt`tYQc_pq5+h+{ zIbKe5TgHbW@H@FdJbY@dQ^_A}CLd*nl%xvQA@xF!^NwOw& z@A3NzjQ)E^ZAh(m2UfU!Z7E=KTg~a0)B7a+`(y<3!uC#Z^WJpnUAFb~`0BV=$dc-^ zigPNS6>mOuuipHQBo5NGs!N15xSjT-FNC571!oQL{6Kktx3|Lglb2EM=x4^egxPeB!!$}`;pdpvUY4sSU{CNH^`ec=` z)k+I2LW)mD*PS^+7PNZ*7nwM$1!uvR1VJi=NCoRfQ?Lc zX-W02L64dzg&|*v_=w#HDUqm=Fd%Q|Ehz6^QQoD4Js^1hZstJ_rONcu;y{ z22F`B%&S>`i%BCvbAXAh!3S^butb*xyDHxDm#b9mZ9i7Eys-JMw!Vw|*Rv@Sq$=+* zL0D9mYNqzmG<~-N47_EJ=8X#Gvt`vID$8SjvPjH}-SOVSroIKz$^wR2bkY%#y;O`n zzmKvMm#z-@+6Ngyau6|UOtML~3BM(ya=5w&}AawZrkoGD$|WFpL%BOx065;JUVGQJ+opcfk`#)ETE0E75&$WB#m z+CyqHq1g%&4-eCmk5PqXF zK~p#9KU~hanO-R_)?Pd1f9XrRdR&vt+|CN`s{REt%1?Ix-Wfx$Vn7L^*7COr9J0LP zRlBM}%xh;YsO(%S;RcI3N2{B_tNkhR%}=!%b0tUHMzjl+Gg{T_-`@kxvLgps1Ru4n za)5lMk<)d{tvS01MYnvgQT{Pu|8LP;dUka+81Of^mNk%f9q4FR=l`LkdlhvG};+-?6xk!O%g-L){;k9c1Cyz}jg3UR?qa%qvy4-9!^t5&CQt94Kln^fcEtf4}71cYP_r6Hk1O!c4J7Y3J=gmHK$^|q?&jT z$$ZSlF*o(KAMU@;OS1K(y)ejPOA!@R7RnvK1&$0~c(6u}B+a3rlK%{L$!8Zo`J(7l zcWFYiA;S8aviL68k3tlDUu1rf=3Mf7X+{1x9~D(mQ+jsor`34`6HGblRpp^7g3a1x zGmK3JubwDjRD}}c(}_$#0Hv-Pg$*Pi?H#J#HWoJth&88Pu<=2p(b<_M*+us@{E??I zd1P^u%+AOo*@Ook?E(?9MSBU>N{i(btEo8SX+Zc*aMk!&Dk1zkan=yk`rKO42%Yjl z8DVqWzluSd<*#A@80}3lAQAh&4vhS%q-Rf0w}jL=LduESO|MkD8_~Pq>NB8O^ndz- z5M41cO9PNXTX17i(p@Wjgy5jt^US}gq)OB3)2ACz-EC83VN=-tYy`o3Wv{CxMId<3 zKnAfkG9U;!GEFD>H(u2P)rtTyYnST?1~O(n|0iZGv^=9?thvOYWY6yz zu$9!mfMvWJ=4m8NI@}Fx4TrfH>p4EkP1dd8@P6b`03s)VZV3OJyEWPWCWqRMsy@S- zADOUr0wRPZ|G)Zy7FbDo9j6-9upXfSYo-rMRw*)`k$AW#) z+SN0; z_?4o|EuB$K@UQ>@5KH-5~gGD zboia5&MYHKrla!e+(&LDk7QSCnpKa`j(K@A!p6{kFU$R=#Dg@yW$guh<mF~@Q)}UwI;pH{CxF+#9d~ETYSRBkP-&$S^mEx*CIBDkND&y^90@DJmVWZD!Odxv zp^6t#pGsTKd4X~Mp)bj#1$;K&?Vs-DY5pkeQ z%4EN=H?qESf-WjumqpbHzwEN~@bFA+OB;X!S15CL*hJ3OP~<7@vz6M+C+T0~WB7yzQ>(6&c1F#E5ph7kg_PciX2x>>PagjIOkLX> z9KRa|p}|nE`Ycl-W%sv&u9JJIb10_cNQPX$fW0>}1_Tm8Kp;^ck$Y+u`9~nZDf`(S zPAaV0ovfP3rE~qUtXBY1{a(OP9dW_!=!nZl{`Mm*5x?fbHmhcrdv`B!SlD(pf5}>9 zheXY35ER9QdOTPhsv1Uv$;v@bW+HHaE6>bGZRNJg@*-OYVU?Bs3z#o$AivSi_qVe= z1bz`TFi>sM3<5k=4{@WSS7?0$ruYvR%z#W{IFo?lO%5k8bJ>6#TI=`g+jPbi7X2eh z^<=RXKzdsoKr2H&ScxDNN*xhZgY2PPR5u|O^-`JjRnbQI1oeLnj|C*Zlowfoa z?tyWWlQan#m+_{508zO~mCN{H>1l_74n~sm4@nSB`ixfd6(!mY-1ZiumjVoX$j?Y< zu{Mpm^CePpJIjao>oMl^!tf z;W|>8;V^8ssTrh(h{MO66?9@gQPmF>WG*!f=?U!9?;UvpuAh+6si$nqXDam`A_4;l zE76#dAU2B5jvo2$f6SU4a_;+tp5^@lrW-HBALq0h-gfHBuT+Ua|Ip-gX{1@6s>!lx zig2PBsCCOL;X6E_E(d{{D1pI-A$0ukS7h4Szek3EgOF1sSWtUaxm&~#$A{*IF5O6C zL)0tp4i*LPN1Fn%bqg+X4xt_}rldRmHFi&Ind7e4mxv$kywGsEV}%B(KG}yOcYpIZ ze9pNwAAS~iV{PmFZEde5%C{Go^enP26=v^>K~nmjBM_n;bByW?V+I!@K$MiCNCnFw zkZ=GJem1(W%qCN_oBr0FD7du8gwuSrNRUN`gMsnP5DMGdb5Vp|7HI{=vo3XxBHuRJ z@RP>>e(nDyS^m|+{^?AbJmtQ$#ke$~km4fkV$x??5x|82wE%H=ff&cV|I%M{m^Lil zZX=WWw9J$mb9qXkqRseU9Z-PP+JqxaC4Hpu&nn#B_Zga*PmRX>-|0GpqOa0eiLyFVz% zzh+zuEuY~RCIWkan1MSWbO`_Q(#{eJnrb@Td@M-0{a`gAp}t%<(uNLEL{%vn|kHg6#)dT3^+nYYB$dM#=o5P67x@Gg?E~;eFT(0^fA9u?J9~dE66eHRKE6pfFTj} zQ_99*24GR>O;ZZI4vnk;QKTb ze1Xvxfh%8EwU*q(Tobj)t)nQbCkl0A#T%hw-6ZN|=;W1R7HkxBo@Cgz*RFUm`ujVt z2(uNt@MYTLei2)mDMtXeN%cCzWd;Ij9mkkZ%$;Q(mL*3P(kG3Oj-mSWhq#He2NmHP z;Zfq`&f@=`=&f5Wp*%XoX<_-wVq7ZE7ZYDLb-ox!j{ikfaZt?DUaF1zDc+ZMbn%o# z3*MkZD#8xzO|fI(Ff8#Zk3&%-o)FsdFLPHv`I;s3dMFEd98R`tM~&`T)+I)l;|kuf z2PD@0dJ8H~QHz1Ob0g%K0X_rC+UAjmpRKF~sor#79Ppn?p})FX@7a zTt*9nJDRO#KPYQXn*lZb6L5>3_oF-WZ)h-DmKpL@af|0M=r!D!=&s+GOKpXAz(d}b zCRrUlVyl%Ae1mnCcol;(yRYI+E9Xr0Lo_NBKvALLO9Jzw3o))yxx@NI(3@A%hz%us zug3>EY~Mpd-6T}l)gMI@=9>gNx}9%l8oJ+A=gq)(uiGVaY_P@jYqQrO%~$$3{l31x zcb4Hakw+`lnS>VPVFC1J7Vg+TJG1mZomsCUUuy(){Emg*H%JGBAh|`qdwFM(?U+bW z)i_8NLX%|}NgN$fCWK+q7`|XnWS>0B&|z~_46`$rVxLEUHGawGZ5KNw9yfeS8J`$6 zsfPkODMHQzaG594^Z2tpC5-7%_U(#o%-F3Hk=q z>4YeNyiG&^f?6qfozdtXg~IGu90TEiW5oIY*i6Y8wQtO5<35Ycvg7Lt1^^#U3~ve) zQ-rhaKm6sjM1uPbIptA7TXi1p!_0I)O!ZVxPtEUN9ShP_BEY4=1poj9D$4RY007Eg6X1l6`gg|F zzW@GrLGjd4k_FUE&>jAD&~0TjWB`ErB)kU;jK4mPo3fE706^IHuYoe?T5bgZP(7*0 z%jo%@pxXR&%5+#A!1A9gpMPs#hbMV+jme{@zTT-pa3PYKE*$wJ$F>Ojx|@Wml0);ToMt<3VBgd zGlm{L3<@opFz_QvWC*=+Am>E-xnkQRZ9C~ZwxjhsjPEI$IFHzW(TDJpbEM*#Wz@0I zDmd>-?5|S8X3&c1CA(F3i@$js@}&avX9;4n`KR6!m6$o=Vr;cg{?dO#sxYFjkERu$ zk&kEeiu9a@mEED^3z;YIrFd<3fcxscjN~T}sneDTfk~` z%Y`PQP7(GCh+OywZ3#o7DAGzMr!7^&%i^G9st>LaPXOSB%qq2}DaN!qRcEaqFSSjG zQ!QoXmHgGX!vSYGi4UJ`8W4L-HgSSJyM>uwtUFP2(Y=YW+53+DLRSszTi1Oz40YY2 zKd!%>mSrDTeRF&NWvrbkx8liX!c%4rk-MYw6470KQaEtH?G$*S6{CMR%=bF=Fj(?N ze2N%Bz$NiPyVA+Rikps}$C%0$ow|#e3k6-BstfB0j$y`-%$WvtXlWx35>y)XxG8IK zQ4Zo}JIKcLHY*;$^s+3Vm`p}{G-a;Oa9}?hq|b7~al_-r3h5$vS&G(2-eMXRYTJV( zD|jp8#LPkqDcA}w7wAb*p9z_$B2LC{`LPAZedRP4q2~Z^eOLY)Kz=+*MmZHkOQr@ zQNpjDflHO6vH(BbE6Bib8Q@%qsf+M+5Wf4STm{)$b@b<*9=n%mDGdqf%|US|$yzXQ zyVu4)09yY0mF4g6{RPgQm_v!I#0(4CR0xsvC}dNK1`-wxq3iL-ZEz zNKyjJ2K$r;NWic34nZvoOC{{2WGk94spAE=!;Tc zb_8wQ$@mIL9m??R=MqWZfBe$T+StOK53!WLbZW=-m{nkhfDe)5WSjSb+M6sr37DalPc%W zf7+6KgpXHrlL&N-_G6~!!;F0R{E$sNv_9s(msaW}7FNjP=glC-a405~5z2HTA?>r~ zL*ZsCB2JBmgrsOi2SwE<{vejow~z-r`UMJ|{Uq z&~*7T2B)aS+ux&MlxAstgBt#^z#jO;w0em}*feq$Ti+Sa9WPtEAzha9Zm#38tjry?Z_AF( zUGzpi*`^f>Ov|qR*&(9qJ}=L(wsIPqwn_f|R+xI%uIJ^{$7t*u31*do>*Pe{1L$*@ zJ~L~=$mZLK^kzYNIsL&V>Mp)NGmx_C@cUC~t!0=V;^}$XLI(1snpf?77t#bJp`gfg zyn5hvnozou506M}cy}ORudgrK>Iit5K0mjZ@oUW_?>2;}v_GDRXogj-(mL~+JMa-& zN%|acHil~_(+5ERdRA_at%OtuLk!=u%rsDuzm@8VXSIJm=;RS`8q$n-0gqrp4{|Jv ztX#DvH0NbYI5y2QIe^o7eNfvPk%Zre$MD{-gh5RW#_u}0u)drhm1i1(Z?f*NRHVr> zUH2Z%95a0w%Jx*a*XZy;H!E@&#EgXKC}2F9Y`l#KC*^`~Y)+RK8L2~C{9YHY(A`Z5HWxofZg4siGl3KHI!$qMzpHtu*Gd`PljB=3%DW zUh~h$qVB?O+eG&1+REAcUsbktb`>I_ory!jAO%(R5RT87l(Vzidy!vEvaBZPn&=g3 z2atY*+_m}=^YgoI zBI)Vr0aBYQE8v%;*4EadVq&Co{&Td-4FfqpezJ)AGy+vSQGO6wDislJvv=2+P@`ZqnB{STpPsy?<hv!^vsM58d}=of^c-D&RLHcoNx@M;XN=c z`NO2p*Qea++w%C1;F$iGg`y)&Zb_!@z77t@&ulbPn4U#fvsYsJaR#@F@f2qGS{k*} zNpX!Xe&xi7b5n5~Nfk>Ck}3asN#3@5iLWF)W$>-21fMEp8q?3SeXg?Q`6(l#wbwSr zL@b(n&K|OVbpQTXm1+{s#qE{2d_QMek%?JUQ``2ighTh>Uz?o2g}$Jhj{cIgvq=_6 zhqm9Otoq|v*4RK1vz^pe{2bp<@;Z>ZOFxHCT3oE0tCzT^CGB2!oxI`YyP94{6I>-v z5+%Z4!kJ%uV#Yc_#=f4OwwU7Ky;WGeSLh!G%i^gLe##N^Bv)$=_WXJQGS4*5xX0Qb4F4r4V%CE?pdTd@1miec8oIWvygxaEzhPCg9?* z?xdZ70wXE=T+Ev#JX|)q^;0kP!Vj}Ks*t@h@wF60UG=7|4}{hvRr$U_NyLGV8_|AC z7B-5wf9(+spUn}oHF7W{nz5zg&&qyRc_5>|F7bGs$m6fIQSoIa;(^o}Bl&ujNivKH z;=Ju4EUt?OK@o4Wo7csb{0t%@v=Cj|h?!>sov(PdAQwv#&mw+ybfl^C5pM*H*=C7E zT?(tP4fv1R2<>gM*9?2ILo8yAAP5@JaB0~^O~0=mL|K^%L1yb@ldZlW|c)4 z{>89y z9^3E}t%I&@`%T%TmRjQR#=lB?yMnkDeE5@OB4uFkv(J?r&at)50jm2C&VkUS&$Dil zRU0ciw-X(P(H!LOEd5U&`o$C^8JoB_{tT?=8^{;prKP7^yKV}~_P;@f3<9#ia;60X z#z)~M>jAH-wVYQIPN=TD-(mE4(Y)~=pc==!knKK6!wUYml(XF}^QLj~Ocby0o1nfV zF=pR}s)s?S{35S3xzW{0q%6KJn#bRL3@6UMmKD!8jJy;@ z+8iZ?4A!+qtyzP#1KN;NzbT4tu+w_#TJzSZLw1j>@kBWeaGIz}3ID+jsh<7N^qew6 zb;Tx!F_k4Xm}n!&)z5E5nwJ(+K_Wqcs_S@e5c)4&DC$8Gq9?Z;zdg zBFYZ=1D}0*3L44tlpwEUdM(lI@jDrIGOLL)H!yjyb1V#*o>rQCa57g>fUn?~)dWU8 zehcHLS_qRxantGH;*a z?F9(*8ACnNO489h5>QE-pnm`q`G(OJd|8jyYi4X#rvPB3PY{mBBZ z%UH~1%*P)5>2R2sBHslI)M#5i{;@;k#76q>HD`c;G5Yj%=d#;Ghj^Q&KR@f$ zeo$~`f5)7oqZ4#|doX2w{qLhS1JeG*qNH;=#kR0xN7|UUxKSbhAj-GG-8#OP>+bYar14(WRHyucpzq`HEZ#CyDo^;R^TPkRIc}a5GD! zk57ElLIH~S0lUii69FHl?CjjDJ9!3ht?DDfI&fLAz<69$o*Lf~MVgje*Ac<+7hP7- zfq>ElH3d8Ne}X9m1=G*FCRx&Fs627^w)?x^3D|9wQBkkcgry%DE~$QTaz1+ z_r1Op`=Dzn54aYnrx6VT-3%UwnD8m}6o2AN&j7v!N7Bb$YM5Q$hV??kW!S4a`3#Fa zUY$UAb9jDMn`L~6BTVwhNfy60Tlv^gI=|HT|H3-a;w}ny(K%PIW6tQe=)3l{ z_OV&J*|!DuL`zGfb#Z5gh`C5}T|-p1!s!lA%d2m+aE@`YwktX>>L)qySoYzamw%?; z4?Zl<%xB`crsBE`DUXMR?20cq& z2mE&zv-BrJ-i8aOjpAJdH7ef&ms#kVsWQCRA8>x|UIhYw$RQ6kavQmYs<93Q@Tt`` zm{zC5iyHCEOI2;DS7u^LBi9?O9%SRUqW-PO-F+G8?{DPziE-&rb}f~A3EFKsd*F?FjUF$v?|yIi=s)=7`T9xQ$c*PB+^3%`PweFXLdca%O{J*=e0u~kfI*+3 zQ;b1|<$!5oytanD()Whc#&(VZXi#su7d4)3N8sV9XAe;?>g3;NKvw=rpI3EVbRF7R zFe1XuBN6a^0MXlPTZ^VQB2FF6Ab%#Suk=IS+@Cc`bq$my++V|CD&CdZ?#?ncnxdb! zR^m-J>1yjPuLPC23iuxvBkmYNCnh)D_04fHdbZuBbfR$>juDCpCWTL#Uy!dW7PCE^ z7^7jEGgY?0lfQ}k`GTeJM`PjsL4CYYYfOjS(YfMgJl0Cfga9>iw5{8Rmke2;Ya8#} z=-Moyw}1E>C;|!)`e?LN(5PTTr?`--!I)b#lc9@A&{8Ww)5QI2uZlJ2MA)^efYbdt zf=AbxGD4(!l@u#+8YX9Dw67&~{TfV97sz1xwG6WvU8c>Mw^|fv!Ro_vxqU9RvJNZ| zUyhrsUVaXlRD1L*h{SA0rb0P)25CH_PLxhB{f@$NHOi59HQGM++?&*qVyex{O8Xj; zF9V-H^J$d^aGgXqtIVc}RFg@-&bxvQ*ic%uso9I=@4WEBnS&{clp~L!Pwj;H(();! zbC_c97MmIC*-B7Ltnz*^E`;?`hm7tPu~t9E2f{SjDO84!k&>X&l5gMdJ70H6=6QWg z+u0l{T=lQ)T+fHQkE?H`e%vT-`;m9fvSIr-Z~+LAfcS9%JOWf?*`MqoC!EO#ce~LqMmM@Z zF%}N*Y5-XieO&~u+(^dfof6r!-n!OrCMbYHSDTTPIjONBz1uTceE*IiQ%s8fXk#KC zGv>IYcR2X|N5i=&hA^|1MrA*Hw8#eM@Hj&TE=9csi;Xxkm{Y<2 zzqzBjtk3kY)uF@Y7`<LaR_|0b`{I@*A&z>Vl}^S$OEP$5NX-a`zymkh!>2ZKPX zYK05j5O~)M1X9Yf#+W;VxsCJ|Ug+1qDb5bh2-Ye1c=~2tQ``-BP_@{qOfCJ)(-U!L zBgM2=@j%yib{Txxl8Rfio0{6Vf9h=!U3!D@k%OsseR&I8_8|E~tOdc${oDL6BeaG2 z!7bzTXVGV90!|vE@SC82}U3&>7?4Lh7$8~^rMXWB{D4hSd{U^`e5d%2AzNG~ zHm0%!5nJ5DsRUNwP+_B^c4sb;KIQp6-&md)OUKkMMoMXZhbiq{`nv_&SmaeXo8w`)(h7YJngy96PQHu@2~CQa>6&k%jMAGgT5) z1yDHtLVRP#Sauk`O>gAvhzkNoFY#H&i}E`jkNu;vopsy?jcF?yJgFAn80nT|$G`6u zah{)%G%;CLLW~dgiK~8Y%5oVQ%j?y*@OsVUDr24Jfo;ur_LczOQl#w`wAa@1=Bwx5 z5y`oopGTCBG`^ts@nn-`Cg+%p_PHAYB?{?9(`8dLZ%%frPz`tDYz){GrND)maiYgV z->&wa&WBgJs%r>2@6CBRWu=>Dt%{3vCuw$vQT zjS)3BH@7WC0nMA|9FID#yj!!opg>!9$FtB0n&0P{GnU)pTAA9~zIB%`%uI#!>7f!@ z`=$+3;zt`K8t61}vn1#cZp)W@Y~mb;GU=(=IP>Sk^JFb5! z!f5e*1N~5q(S%$OmWE%=yBE-lN-wfdmAdEN&V(UpC{`?n3=)^5ZdE~~LU?l=`@(|K zBO}VzDkQ}W1nwIu>ZGo$WX@#;+)&tk!M>bpIegGVbFvZ+zCJg$9F80+4zD<+XFpnS z8b|KQWn)Jsn#X2{4KYqLeln`T_!L}BGW0_h^r|JYIu+{C8CBaWci3zQjYy?iGt+{v zjxg4wUAdYcN)w5x#)`&xpntC1hRJL9)h>f%5pO)zF`=Ks`)#NW$8wo=mIM~NoOwwm z%WNOn*wqMg)XZPYTlP3LdMuAUIDnhmWFpeJ0ki7G@knhc-;6?mtxe5fLvu;ellSYI z>$EK~2M)JL$snsUgs|tf&0kV;h7b{M#EO}X%Wd^JiP^F&O%bgNF)w6Nq2LY@HqDXj zmAxM}`U>hSYUS8yAp>`X5KV45#bXI5w5Wm#raV&#xjTE`Zc_qrt>}Tn^3yn(PI^i^d% zTY_qV16M^Ku+x%%#fMrKyz0K95_c*(?*g=}$qJS<(06CXh1XPK6VSIc6VG)kq;ZWk z<)qV8FxM<)o7qy?kCjb|bF&N;Pgge}Fn39f-|ZjS8oPGKp>v7On~Lvii!tb~YOolU zWDH1Q)2|g_OL-gtk=!7IG>J!h9lvQsx3%_u#yX%W#>yBJalHu*FAXKnE7;T|2w3oi z-jVG=8h`+zEN32P-B~*fkJgyA_CAUXI)cu%$EG}|8 zW_1l!o?~A}JE<{y{h*o1A+>)X=a;-{^t{g9WQ>ak%t|A$;l;GBb=qf9iASoK@?;Wr zbL%iqs-FHabogWM4q1(9YU~FyvV(|L$+`_~Uk2^rXQg*9k@8mA4^rj=qzgLW$1XbAr@pwDaGvn@>!vJ>k zlWis9X;5&B8b*C#MKZb&7Gj3e>+vC@JS6nF#c+Cv+-6~c1fHmW}%wG<9#08NWXQ|mD zZs8@Phbc`K^LJzr%sV!GZr{dE|ZyaX?J&d^fqn> zlsnH|tqS}x*hOY`3}g#w*=3SyDX~Lo6_xY&@T_6H!>+zR8Q&)wcwpCaP(xMuj#FM2 zAzzoq_~R_6%D&C5$KxCMPD#YNf5;t%wnPH*eB?*}Fq){9bvhfWp*`3?^3|qhS+cI| z&v`7o4(XbF{wldK21A}yfKYFQE4QiA-)-LhW>78Xw*g$&f!p-QYOXWz`%?&Q$;oqh{`uKyE^!nnjFcM>4BdaafwjybKnz~2B)&c;^36U;muJnWX&yFz2Sqc zO}(}?Do!z(P{Ul)U0AUY6y}ZJM5wd9rdy!=mnUd1!m1f&TyP`nKIwf=XM3Iw`vpnD zU|`@u229VYc17uO#IskSWG9HSPnkXWa+*IUbSjTc0p#29FA0|kuGy)Vje!AtejqvV z?RzVLB=a!DjSL!;LrQn9qRt%oaU&j=&YmE9IJX}7gDA*jFEX&X9hNT6 zAuE3d)b(HZ0kHL5f(~tyMc#W$y zx#k@;Py4RFBoxDpFUlZ$VCGI&VxMD08zp5pPmgbMEn8S^OJpaulB3bRSzVhyA(bYkh0f{G2cZ);p?4m0~ zb>^}C5F)MCf74`iT^@U4rfX2VbrYuiEo4q_p?@eX){Y<5Z5N{Y=8Pt2(G~_u_~#Ih zB`)}T$;N*9mdE~-SNQEsIuyKb!=f?N^Dn|cLlYBUyk0*YrP-1s#%}^#qC&0X2vwsF zKQap5BQU=4=t8i42nkzhd!`azy#w&j&$lZ4@BIT5Ae{6Y%rT-~@v1_Im&yvR#)@x4 zlg^>PC`oT;E0QECG{vNgT-7me42C$Vdrtr_D|o1iRO=vqt~Z_$FWcqzfD!>bU`V40 zxS9y#kim!}OL~w#epxlQxHPT%_Tynm97I4XQ7PANzMXZdf*m=FG z*fz=(nc))PhBa1u(s34e9uWWjnM2N#f94R*>*uF0WUq|_t^E%(6;F%BQ`D~_a4e=9 z*~<|j>6*Sot+-wC+)1uC)HdJ@%${WKt@;L%vvW_lk>gX!m5&P5c|YRbdNUTPRr-O4F2G*!uk1qiZ-VcSB610@OO64! zcIW8_u4&PZtXi!<5nlRX)n9=G7rE>HR2o5+D*>gN=0rMU+LEUzRj_#{dV`Q1M8CrcF(>4L(L1c(OHwsgUGpN#+WWTqN0$U-D&Xx5ENuk^3&@2d|rZB`Q zEPq}2<_sPp)$Mx87AwerV9$EQsY?{~7H5cQ=a=Rv<*Ts?%`!+^l|*kJlD#wKrVIL_ zvh*(YCn(YZ-5;h77{J33VIcX$NqyC$DTa4@CE_;zTe0GmDfp z7q9}e3Z^?VnnfO&FGl9RGa9qwr(GlxT%ylgMR;bt-Ly_bQ<8d)v$l6wWZu=L#vm<{ zvYD6U5hDF0*a}r`1?aelQIA>*BWC36$L~U`7z&C976wP~eHWyKIxj-2N~N^tWu*vn zvi>$nbG_2}xm|jDMxcq{RH0K&12a)A0s99^Rm^N|-guXD(Z`7$Du`{Y9!7#?4ihA{ zh^PzeYtqkwH)l`o&&hHRu^v4J$@oz_QXykU9mXB)m-v__Km23lk%)bi;$6q?Q=V}7 zCC&aIG^rLRv3})}wm(}Ddws6;xzE@sd9mRk_Xc;Z1uHED1}= zhQ3c9)ZP0rDSw*^zo#BLHgTkb*Bv39^?ThA`P_RoHn2)K;Z{Mm*9^+kmV*}9HZ=?x zq!}C#>Xeqi@xkDLnd9)j9gyHsz0h@W#!@JJmeey!H9HmamPbb8Y^Vnx00J}Cn9BAAi|8}V{c$*i75wac~ z0xI6*1o6RuZpmLZsdPE^v(Mjr0LSpUl##~>D$2 z;~$E7qD{R-uq~<4++)+M@lmJMZ2L^q3*7jn_C0l=5Mdht3EKc*#?~uPKpPNWG{q*g zO5fp~3dkgOqva+9nGSHuz!G65j(D?JQ;mc*m4O$$=sL@Tv1E}$oa-R)1t4o!qE+Rm zr^*iq#a0}tI&urYT@hIUmbFsXVx!5Eqm#qrd#X zVF&8ZO1i4JYp<{*8L9zke_685|8GKVk$lLDN;?(pL2NpVGPVUNss0}KC$<8ab7We| z9SO8i#yxGRAfSy>uf|gN`rFsXMCZ}uND^XhetFLRSuP!KoOgbZE=fY7PoNM)w#WKvELk2x(gmAc+x~R1w`+|B0D~hJijDC-y z{E$vfpUVr?7NzKhJhq*Qa*!BMBX#7WlyxplY`zJB>yfqwUo?$o%wH+a=c!#1K)Fwso+K=e z-?({y<_eJsrR0Xbe40&dM1SIkrH_W8V*H@UgxqH?!~=H!isp;znbuv`aGiHTBW!~T zW~X{w>ua55z}d$mfU}GF@_$5_I@WQG*%!tN6Xr3?7SEOX!>`7&BzMIuUkaCi`K<2N z^W-8EQS~t|#*CZxYIg?Uuu2Xl{UgvI>JlNwxU0?9lTeljf`zI!w>S;2kNqNVRU zO9Tc3S~N@z-T$FWY>to?t1ThJ76m9#3TxB@ril=X^sBKnN^#dQ#q1s)PMVtiS~|%3 z=P|=gFOAvUUS>(Bq6+nExibjRfzAD$$FmF7TWTzqPQ;>sk!$UJJQ?h5dk>uV{a*JVD{W+4!b1~7kJ7T-0y0_(m>(YfP|_k_Os)j1=Gl!M8cVEW9=xzd zyKQQE+3XimBO>_qk*5xT4|#2U>07a+sMB_2|EY=4(r*GA#SjOy>NOEhnW$j=kx>z0 z)^zin)N%1U&??XLiFN{me+L{%$GVerQ6g{fG$w}>e30|w9QbRC`Yqg(TvPIMnpB> z#&ZbPgEIpgY3BHs<%~q0jv{#5BA5x!2wTd7|40D}vq+D`*&)-~GMkz;gv2x!C+o!6 zmUu7y&F8am!@(O}V}@lHj~(PY4rcfMUY!Y_##U1EJp&UO1-g$-fv5cRdU?(ym$&iG z1K`v#5y zZIs&pQnFv4=;R|EqtYYy*Wrbe3C31mlpPa6?y0*zeDke{yTx`4$er@*ycz8NPL9+_ zE6}Flfm7nQRyBes0)J{?YRdZrgGCg`@CANf7dqjShDp&q0)9rcIEpg{zL^3Ie`Fsu zSk4<9D-j9hal`l!zjVTaRX$_iZiCEbiXyU1z*^RN%7si?ko%aHro-@>Lm@xcYquDs z;~C=5yFKfYriX`ZG6$Sstw%@q@WOm6()?L8{Dmt?obD5DI<=Abz3EeS!^{|%P z^*IZ#5B4ZjyYZY^F<8h^1z6&Y6p!LddWW{ihi5*$dDW+rNJhTG@&1rw-~IR$8VoJqt~Ydo<-H`}9b(&C2dq zDpz58TCpvrX*ydar&3JnS-@%>d@NQ+99#!48=0WSTmG8#`LQ2AV`@3Ih5%pkC zKTfq?So5(3T4u;sI{D1>#fBELB3ltrQ9vodEfP_RAiYIwh*DIPA_SC#CcT87M6n=JB}#{g1(X&D zy#}QOqzZ;WLO^K&LO@DF2}y2nf8Y7fJ$L-~p88+LU?eMRt#`d;mS;Y5t~dIIxv}ux zV|xJrfUwEcOSb@koiG4k2jS1%{9pQb89Drq9RatDF93>rq-OaCyIhUTi~xYr1fi|_ z0{r7WzE^Dn0D%3?+y6TVJ|FqF-@0US$>?^71A}T;aMC(?h`pk;s=6z>X*K2+^G7Z) zGZ31iSq{ARDo3b_Vk_uj*Y{B*s54i{|a}pQ+nC@?LO#v z){VoGyJD`*L&WB>2SL-Bswdi{0$Q9Qu7yWUWM_%+UbXGtPMm6IJ&oMA{dI4S>`wm2!waX{w-4VO`1^`ePyQ!PCz=Qh z13BM-JGLLCd5>uGZ8EYe47h#Nm+(LFz<)a$9eX3z4_s|SL$|%**+Bt7*Y{BPaQx2{ z;)b3$@iZ52v$(bK%Fl4Y;|`=Assw)WGGM00P{Dyd*O6AEf9^i!`R(v?q+x8u;$miO zWrZ30hb_ExuixqfIaSYkHg;n0_*K+96Sg5D0Y=9Og7hNotF#KdhNc zDtRM=jeUYOlRI`lHi7chBw_&On{uV+QDmX)yM{D6BVL05v@mj+Ja`ypOn$M21VIroGwGHCi4$Bm*k)B4LJteI}(?s+#9UEdtkB z_baIH6xs`eDyk~47*+b@-A+tHxb2_#5!*H%DUjyo$!!REEb#5mx{T0+gBc}po?Q_5 zsJiS%i@8QnT@nfNU56@MUiB$D1M#g8E$q-X&`d=0zB$-cA$0*?cgyg=kg=Pphn55% zc92U=<3JrxT;kBoRQ9LRB4F@Ti*j53Bfo126(+Z2doO2W$&R`XUjt?a-I9a0zen6Yx`D@PoFk^$zBe6zo=`$=IKzaHEWl1*8+fJCM?XO!Zab1>H zYWGKozB5?RK>LiPTE|Q*%v3AHPZgE+`u1>0-+NG!7}~Lwucc*9>Sq`Aj_-y@dP4iX z2gb~E55v+zz_d3iHBxaY=EWbF^H8pUZEq?K zTjXjkq10Zk>toH14!DG(NTrI8)F?H|b`GK6C|@DB>7ND6d67we87!&gD=-mLs^PfV zHPGlD%JXMuwcRS{8p7=%*hTx=9^rSMkgJp z=w;cDtM;pY({*T!Q>(RrH!$?kgcBBxZ9Qdrd2!RP-;scVX+rN8;iX-RegPJ{$6YI^ zg=WXrLc~_#@{49(9uVNHQ({$UnTqt|(Qu#gj1UYJ(Ys9O3CWQ1xj1Nu^K!XZkrtxF zs3F({mEtyu<*f87g1WL5<@O?TbR`|W|LI}n_QH%e>cW2OE~mRSy>=$V=?K-&Jw&hz zW}o$C6NWU0Rl`>c#S=(~Fs+fMsqiIUz?7uSL+E>SRk~`BEfif-wB(@aeTG#%=n3{! zMxv&*J+e~H{@k4OSlNPqQLF3?3RQ+EVuk z>{>tln`-u;MfV@mS6k>l8;!@X-)^V?kEOIxCT~dYRjuIboLDltGK!^t4ic^kRsYm5 z%}|VsA!@Enw33P>Ea_5vbs~)9^HB=B&fr5;-3Gg*DDoa%P_4W0#1JV3y@XP)+|l_) z<~V!FBYElWgUzt1hvUT{$Nd1xS$QyY{%c!DqgUM8ZggTup{J=&B~V)&Z&qh7_mUCy zbb#QCKrF*kG9_pwK}MRKO!I;B>;pBIHXXFE1U8zAezZOt?$M}4TDPM)*QYon#4p_d zS2+1b2-p@d*bB#MJ=C#z5Un`I<%R|RvOKtWyvHxJDxp}qS0(B?O`kV+#J z7Z+LKag*63Y*D}|n2SJKj{Ec918Hz)YKnT7*I4-V%r2K;K5vgDsG;eBO}x~pFf3T+ zI^&$0pd>)TS#u{W(fA2oL7;yupCc+zlW4kzhFQh zH`Vu5^?ssYa&uV8^eh4eFX=O`aR47kDX|~R7;bZHmG?@Z*5s1jK|NdSJ)t`JnO{7? zKkrgXK?f&t+py2@K>--2&;|rb^1-;`-lwq|Vq!#+%PmI5AdVg^UqRBhAO$=@jAgn2 zcdm`-3!+AvGt7*VcYWB8+rK{3tzP*Jn>XSHk_?&D0coiKf8e}uP!^hfwYUrv1Tn33 z)a!rj7S{Orrf@dErRC~itZI)G)}y0kmM|588m=x1oOn;U;>DLYDi^kVZ~onIvBu9$ z9Q}329Ru$we6r?Q6&qE0aYgCpdjFBlg}C}CXeV7_Hbl4;3mH`EUFeRTP@%+v9VhGu z_>#8}Q^WNg>cP0E)ZjNZK+sp9#ZvBh<2JWyGgeiOw}F9SeB9G18?Q@_c!T7QwMjMu zSJ)6Q4$D?{b8gi4?=1^>PLUq^xmV5eqem=4xCXZK55T^I(O>5eodGmS-AL?C=E}+Q zclt^K^(Ar~062f%NYl>$Rux{%$Y?hp0D2fUN1p}&t{&!N8UWzNp8`j>KM!Bv zpXC2Ny^*->&(9zKkDbPq{q68e3=7&`gk1RDRQP|b$$#hFQkAmdw6}MuqgGW_1#{zB zWphq&I|v^SP#&$&n10!qjLzwa`r5*YQmh1^$Wef`dL4cDwS^rg|_6IyRiME$4|sPyczkcR3n`U?4&-nR?&J`B|kJgU&tssmeX!=HkUs zAq3XydHzmM=i}&V?_Yqk zLUqR;i>oC=adI7VChsAKTu*Y46dL@IEakT8;qD+Y^4L^BIBK+uc0cWu>z)VbCbEDh z8ckfn?G--vjagbaq4%n@Tiqexxn=l%WKAixu%_`4Hg7fxmq>ntDUxjN!#jfw7B(i% z3Z(grFd)kH6fcB*hcTYw!>!!>EwbqJ!ZU>-c+Tl#V!DH4oVkGIKmz+TUyf})B zu*m}HCEFBwpm#X9--V;Ods)J~|IZyi4)iZ|C0H0heKlFLr8nc;?@M{MJxJ59>MSwM zk%kzy2R!rMe}|C^nI1hyzD*VDErS)?TH#YbVbU1&bj*+5OO~cE5>>e%AW?p|2`aF2 zB>aJG^=QBe*8Mbu<1V^Qz}Y5zlUqPJ&R#5JR7R>84XqgYQVubnJxk;Lhu=^bWKTNNKULO7Id#rVS;?@Jj64>?H#OKAJCV zX(Eg7c$F=3N)a^^otpYk)s*%_1Da7+14Qx|6t9S9V?eSsNU^gAD(@l+YUuvkhs|S`Vv{_i+U;s3KKMy3_WtBFYWIBBAHQwM)|KftD2Ap&NV_?n z4HD!f(|9<{>kkyEwwSjhHq_L!DCNT_APja`;CN{yMX-Z$E0hBV{ew3 zcOGBo_ijH{ItpFdd#t&6ofw~?;ej)QLyNNAN^h4oeB9`}KIVZg_2h~%%z7wJ25IfX z0l}~=LTot+wpx~5El2X0goN5pHpYdlPjuCb^d2{VnRdO$F+6K8}}`dU;a*jCl; zC`0ns*DauIGS0tWGA;OH=@hPX9bVM-J*ZvA>clJQ;kyf1;=-F+KNmlf-FpD1K+;-K zZEJ5No5S0}vBMTCYmF>jn?odTa;R!XN}LYP8!c|q_=cRDo`U#eO)krBrN-vi1N?`l z0oRl6rak^B^+m~%NHP?|s3)foFCPL<$aEQ6q#0$(owLr=0lt$+P|qIa&l*)Cmrn3% zG0;^zr_i1*i4JtCLfRKg`iD@d@3-XNYmuu>_}zTwJP+0ZKBh#KLdb9WccX(MPV9c` z=R!gp-YNZX;C6y>@8$kP)9SF;3Ws3mea%r4)Q+VE8?KIRT?+8jrPat4su;y!SL`p8 zUw(b6EmS`vZ$fo$3McI16?~&u=cH>?@$fEn=m^8O>htkunR5JIm(Ff>UY%r^iR zsyc=(m;57QD`#9QDxe?Z)5b^>Y8jDTdv<2k?J(;1&B!=92~HXIri{d{UZF#^*yoO2 zAK~fZaWjT-9#yZU2Zf@q*6F(|y6+2|D0e!1>?2$XFoX@-TIyf=CiS?rHst}%EQPQ% zd^MZu-&Qx}p7cXbq0IS#Nby8e?y{d~_<5aw-Ep7&i zfe!++j?@w&s)ve3csKPK>$`YFEInz$b(;(EjE>wFeoxNLaLFS{dxQ7w zZGa%e?K?~#7ow!GLnayxNwlRu75Vc^*!_$TA=bKatOaV_tdv5)Ht+ofOd;c;De9n=AyBMM+uKp=XX z3b)$oPQO^HH$SYhrB({W$CE+Hm&IZEZ`vKS7_pJ2^;QC2&u!NaJkgFOnPl$XyO%1T z0Z-Ainw6r`M!dq+rXM?W#$rDF5>+d;*YKyibdv4^yM?=SpPxAPq+%q?!c)IC;17V> z?E5ou7EM$M!^HU(j=nEcQ*?E_WBhaJv^&O>09P)E`2aqSUh4PjtBH4Xq?rqy70b&} z&99QBOAeT$F+!L24S0;bm$kFnQZ&Am2-h-QVfQ_b1s!{`5OH&)ZA1p}rb5(D&E>AB zuc3F8D#8sH)cK|MIwtex_2tOE?0ylK0QZHGvnI--o3}^_vGoPh;}zA7ni3#F{Oi2s zR+a}wsPhCGIbBRWbt|vD;6q!l|80x*Fdy$hi3dnj_xnXIYUawo0l+;aMlg@#0f9|H zBeZfw%m%xWTcS93QC;)YuR=+okYZ9l!}ormGJ5h#5dNL4hl9oGQ{UMp;rlw1m+wD( z{jL)f=aoaO*HqF*Ci4lI<^3m~T4>|iRGC-ke4lh<&TqBmnp2pN8Xc~+o858uBzbr& zaYN_+qmI9HPpkO$i~Mm*SHWKDM9NFm4kxWt>#UNO+G#ou&OMujC)KMdoHe&gey6oG z>onMMeT}Hgx}W7t=vAXcDw?+~i*UZkEsT1!OHzx0lX%>adOR%4CGDHe4#1~hM%FO7 zuL~R(MKc0D?2wgcNUeT6@xcgd540ho!-SPITi+zKanVimfrDe1o@zkafp@FTi4tW` zi3Wjl1X~ZdpGu&H|Z#^HZ=`kDSC@`964}ywVNUj@g zT=7s>Wh8u{5b|q72zRHSKnufFBG@RTw=zXMxT{iWPe6!TZcRWxE&785J;3I$#$ssL zyy>8A2qn}vtt~&7zzJNa42VQ)9Rs~?zJz0JASM}J3L8cE9yvn;gh~v2U|LKD-1$>T zO)I2WxuBD%urHH+U1saea1iqKI(v`XreEC-ZD53!#}@M*)82DJFL@}Kb5~4(D-or5 z{)$kM?EX_3;xO`eX7fF~_wg#>;36v{mm`+~-t>wFR27u^qM)ba6M>ym^+%?^tUkW> z%>l<0Z|iRLHzWn*q!%E(OIjv_70sumq+`mJk+$AtZ&-N&FA`mINizP5M?_u%m35HG zkHujNxiuN7Vp4<$jvbH5K7&{DK&y<09vZ7z8r+xKQq^eY5#XL+bME6uIoieHs5~rc zhBYQGS|CCG)LR_!joz^JcJrz-`&Z1|2gjg0h|^=(*_DBGUIzY|X{^tU+yE z_bu?9+P;q+A+ROgUnBaGC;X0mE$wHHgd8CWQ4~KgrZ|eyb(E1Zh_|ixmZG3?yM0rJ zs|KqnEFx@WOB5rxFxc)-g-TUM6FN_rik|2iRj**_byF_Dp9A zbIH-lF~UuW_i=N4%8R-D!7eItKIA>4zv@$CCAjaIfzBZ5!q{_!G9(Y5F#ev|W#`ve zIxRzQXgxbkmcuM9&2N&Npc-NzovIkPennA2PPo_n%Bv4c{*yxn$#(GMW8lvFe9@68 z-=XE5T6f(4SDYw9@7|L=jTHI$ca+@FtdZ}(92|{3Brn>JVJ_-EgyehGAwEs!~u=PSRQq@aOHV_z+hYt8Dp2H)2N|+Y(%wx zf4-_{oJ6;SF7|bKyK>*2rb${YZ?^9=M z43TGH6m&bO@m0y@wS14q7rpSq3B2j%P3S>$({tJErRHxd_z4=Zy2lx=s%e~wlM~aB z7R(dv%>qv&C2v1ni_V) zA{0LlN~)P9FN@HCq#U{3vO-L43g?*nH>XV$zu57tOG64~}<o9m-OH!cOAKpY3y6HOq3QSB}ZhKZq8k$_&m{c ztNPZYBt&Pe2`fHR#oJA!e%BgQx}X;ItnoYZM0n5abeX`>STvOI)iU&&9&l|^CGYgC z>jD{F&*z4}-umt421Vx=a>RmT-+?nrD*J>S7>$73@3M~dwZR!;e&|R{Dt1V7blVdf-$VcCg{9go)%tk zb}XH5(ze!vhT@9`ZH7qCiZqXDu$L^_HwQmE&FFl_F94y0wjb!cmBP}kkMcB9t3)h% zK?{s`O2DOSo&dqaQkh1Oe^Q@(pP^ z+St)}&{_IiF?Nk4h4q4M{J_X7d@2K_I8h%(Ulb7=mYb}Mqd7y$J}+L}uf1eYIyT8{ zLeiPF_=19sR5*LKffNsyQIZ}@KXxiF(BI(f3@NL0=&5$6*8sbqinLaaEUJpb3QpXc z&+|fC?dxBW@E-8Xcyp#$Q}uQt+|hNFz6rYDCKB=M$^7&03{zf!xR+iTdH$+oG6TOL zvW=k()$V&X&#JX`1nx6uCNPC^0;1AmO~mvx@XBphGv`NSWABG$!5o;3JMrOpovmlO z6)r^dM|_M=Stx+dH|uut2Y*&z_+H{b#*E(6y6En>E~N7}5m~>iFw7uU(M2?5;OrCc ztP-=jLPM+mzVA!Qm^_;3p_s5Vx4;e!Z9fjoaWM4CLd2c=^hr5yiiT6w!jm1u)S=q7 z3FMS&6suq&E!!iABaCWL-o1=;`OdjPOB6p*IVlxJTJ%u4833HSKsLlgu*(fTdc52@ za8-)TQ76i4ouKJ5JJKNW&hJ)0)xk4h zF&Fj>iuXNL=P3{yr`@5gS!x@`cXHtuDiv08ue%V)SF%Tv6G2piIXW=5H~B zGPx@;)mSnBc2FHOSn~&f&rpVn!>&|hT?20nKm9d(a}1qxajyy6;f2!SDe#W;4p0pi z&kZ{jxrHv87FC==@l@CdddHx0bpWpC2mtWoaCd?1ia@IAdZ21{WbAWG^Z6k2B>lb4(5o%_uDG_@!djaTod(0KEyHD2 z5VzjJhtFU~ubIF6HyF@J2JHxvF_{`)mx=zhf39pXP2iN+a@%37A9EQgWC!=Rtpf0<&Q=K zyja2CS_Xi|3}c6LCHva6`ziQ-xHEobQo>q@qYy7NtGin9l>A1vY}78+Wi*MS*wGN7 ze`i0g#U`%RgeIOu9whWNXtF}TE@wK#Q+F;|ZlkJ4dvT>1XysnPXcs3RA1fQY9Y}GJ zh0%)rDG9+^iksRBu3(vs8Jr6Ar4S`ams2mkzX73R*R!?rCetC!uh2J4L&$V#UB?O) zA6dh&F9k6sIvc~gv6)POAsJ1 zX5Z5?924N?-WesBEwrEqFj6?o~Dar>%bOeD7SzU&=1_&Lg+?#d(-cd`!@a z5LxCtWik;vlI5}jPZoglYPoLAhL3zmBlhK$-!4#h?@nb~kC~bwKPbFz8`7v-XV?CQ zGzQoWCR4u-0QEa|>>X}Iu8_`xCb;Ky^a}j-EL2$ozUAP;7pv3l^MAcVkJi_(pY<-5 zu-V#td%t|k@R>ZyD7Y`TIqhlUd}7$cm0bG-eXGgJ(q1i!aqq@m`hG&5gRyBCTCb&P zDUZ>+P*R+=?$uSjUk={3>7Fq_kgOGC`md~0n_gDzxp$l#tvw60LWyxc9Nc_IU3*;Y zXf6}uTbnegRi4My|4X7r!`xoY=jk>u(W`Q!*)NTDNd65?YK$^`(sY_q{NA8;p)?%+z0j7@+En?8Fv5&VqhI${}$4Pys*1w0sJjPoZwP~<@y z_x&UiAoMCe&Wd-9jU)kAoU>f`pi78Czo)vY|7LnHQv<8`JiBUyu89o7)2F|0!>NBk z8cI{m57qHs1K#Q{YAEuVk>(>X4ODYr5?$|t?!#%VehC>nC78j%FB*_YM*R&0Rjc;J3=?^Ma*f>d8}YLs#5^sQGMhXHyy6W z7jsUzs{6Pi_QX+jVk4S$;Qh`kqtE&$6o$ET3}%hI>TYugmDVyApNqJ(rb364fN0g` zPlSwlpLSfScnq}b;>C$d^S$DEt}?NF1}3HJlaSgWkY4Z}XsQE9K{g`XY$ew6^|ZD5 za|`h@d52o;V5taQQI8+3iowiNpVKqG<90uuzB2eFP81zzZyfy5WqE-mNvhIK9+d92 zHNcyKc7WZYIdhJ-w+WRfXH|^c7C^QVO_%GOqno0f{U#&I)`^?r??!#}qUu~GG9N#h zSYxORw9G`u7I_Q(93Ac?A{a;SO)XI>L4))L!C~(Anvc*O*ArPO<@h=7>v$$pZiEDE z(00g$y6Ul5@t3vTk%qHr;t?5FX>VJrM4|j~y+HIX1Ph%z2FePbEM11?ycAq*Ks^XV zPHilapQB@;q8T3uz5c%<=jBqfY|nyTGE(DE2|bv_@HbY`;(RWreTr#?bc5L5og+5e6-@;_bb|2Z%1-xoPg zw010VKyjFJaayCPCxg8gq>2Ir`BU)_qGw|?y;r*6&-4>7ewW%s`Iba__E@y32Nw@& zNEHPu=Mx#*G>*+~K$)KdM9u2>asbH-e#QU{v~m6EMf>c0tbjb%VTAJx0e)kUwbt~MwRnq}C9{MP-#FRnd>9yWWy z_vj`ffG|dW;#=9rKVp<@)vH;@lUzCXp_SY()pFMIWoD&e8|M|pmzDxJhtOlC+8P43 zYqjAPZN1_mYSwpeumecSF+(?I@<=i-G>;_cvQ&$&^HK4oy*P`4GuEN_Z8oKzH!DPv zIM#tn$X9V-DG6;qm|s9h|EC|v6xLk(kN9zdVX)Md-zh-JkIuh;Y;Y9s`%Fu_jhQXYA;+9 zgBJGvTDonratK;+*(kS)sTzolLuBKAMtc4u?t2m0b>xPMW8*&2wU~lm>V*oGBe;Uz zz?UC1ELt2Q<{YCyuI{DNtm9Rs#W{CG9;D|^JK8i9 zdt`0sG5s>d3cc)f%B@{-5*OHb{Ggzi{Z>{jVgZb&(jz@NU2EAbE8_8OrMFrY5CD)P-FF_fGPP@-awq)SE2Xm z5;wZM&^wHS_Cw#?+-Vx5ZxEtEe*)dV&mLfYjkm68xFdMtdtd6edD9+_0%>Q` zBaEiAJ*O-xHidB0v#Iv-`01GstyxgWYj-h&+UhX?a zIRfKWX!j;N=F!#x=1B&PwxYgc5?boEbgJ{syWG^^WLfd? z{+*4sXIt00cPDEN=9sjM;N9w{E4@BXJ9O@9pE-3xAPt=Chxoi2FZd(y{X~W`?pa%P zj_SMN1k{DLYFx+z@4Z;|i%{dL=BM9Gypm2)I6chHR%Y2}Z5;&kRT$Vk;l8b-Oz?xi z(OHL1{ZbVb^KCzfR&L)4XNa)2YqJ#JuTBN;`r>(k% zmd>o;4u!14%JDA)+EZbroqJzCm54@Xk)EiUV$qXcCXf8c%ThWmc`>%4DpYIwP!v2_ z8r=C!90o)TZw*ELh&hAz-bC7E&SDjhSqv&$?Tq^(;^fD^1K+4Wb1x##JB29{c>MV6 zU|rX-s=HO@PwXe+C@{J_4F-P|V$gOTZ5C!`oX;;n?6?^m`-rnc+vMVeonEen=&vD( z6y=18XsLn+e)e|$Ne!?oMq;$gKKa_37eTkq?TwRoH?%g7tUCLzk`G<1Z#?d&4k29n zzYbK5Zzf9HLrRKV)JviwW1sK|d4RSCKQ`Dl)wM(JT!+qOJhzI|xb#?(J>5gBeRk`2 z)$_xFz>?oKT_Xmg<4=14xv22lLp8bU@~wIG1(3c%nNUvuNKJRq@8pGV?f$#J<3ND! ze@o)Fz31!!`ZV`tKD|J`)Ze@|ZIe<}sSpW6Skwd4P`lsiZE%*@t?7d)I2g7hvv z7aZKkHe#-C7c%I7bOz?t@+M;DhOK+^3BX1ORh9Jlc$R@J9J)C7R`+@` z#yZ8%ma+WEUUQ)vA934&GlvV??BL85mr4NuUU89%S?`|}W@jFyT-0Ml&iB-b6R(Y| zJ!gyj368L$mUAX@!&n!gS#+^asWZY@wO|cY$FG7(eG|z_o-*D>i$q<(B~s@|7EFi>(k z5N_BVY6Lvf5iSULuc_E>wVkoowIQgA!`4vBhthqN^Vw~>HqR$N0R)EKYa9){Uzi99 z4F5byL%v6a?*m-DnRq0yOW>%sqap=t1}iwf3LIe%L7s>YD9bO- zj<_e&oZeT4dB|hs-sNoCGJgpwzwB63Et0LXqw+c~hdESa_$XKL_IRyTfxX8Td=9qs z4%XpC>>EPv8bqvRlTqoh!-FR6i&kU2-h}+TUh0_42euz6cuAD)`fg>2w6;L#twlsI z{c5{|7pz6_rU`y!wfWiHbtD2Yt1&xyee~Vvq$StwvH8OOJ~2Id)sX_}I-qxmJmr!; zesP~C1^Pg(E{0pa6!KG}ls+p&8y>q_T-r$7-O{-1*VM>M!6c0El*k)_0cYAZ>u6Tt z^kg5)L}8!0jfT;{d8!k4=yG@%gE7a!7!(v+kFR_5#sn9v8DbZG26~IZDX4di-gtqB zq2v`&oF0+QJ0&}6x4ef(B#AW-!|5%+cCceJ5Znuz%rGDx$ ztP=y96>V+aWFl&K>DhhY^`8Up*G;M4MF%rFSUqk=tgJOMaOcbf_aob^fx0W0tIw$@ zH!N^OD6;VGx9+jm&v>w3!4bCe^vF{+!G9$$TzurAbMs6ANJLOHCQBR^?iMrp%*$Cl zISGu<_6j#Oa|!;2(UehXN$_4ZDTY#+q|^LrDOd0!K0c$?%Z`Jf1Q|kfcfV3@*KDBG zHoR77AFLrs#x~e>0qfi>f*b96RS{6g#3s$v_GW79)wpwB8Fp2`Kbm5_Y!ZcUq9c)i z$b)`W%}th5l`U?QAFWTp;Tw}TnZM9c6~@HYmB5ER+4U#)+%TA}orC%j~sD$|307`8z2prWW6t0TNl!L=kt@VB143~QsxVFMEMYEGnQQ8@J+%K_{~aZqD< zpF_>RHJC*d@@qEmWeaA8jUd&qn+c1IS|hgr$<>R1)KZQ(tRfuzau4MWvz>R?SNBbj z35r%|zM7rxSa8E)v>0gZ(>Zl|Pa}twAGQurok8U(AA%oRL>Aj|FD==L6r9mn`iK!X zmk*?6D+G=l)xg*WLu(Ok^}D6%SkCYz7euq3Lf#_2>>DQtBE{0k<;r2JEHj@P6X1 z)x0jY0n$Lt?yRMg1{K;LXmwc5rki`yOD{M~DD(C79A8f}Pdp=FS7or`1wXy28c62; z3!9JiJ+d?iPZ$(*IuyyViIAq$ptBtjK9f-)x>pvYl)*X$3n$q_Z+^?GLt>4^S~@CN z@s7yCa3vEU&GSkon`PY_;}qmkpS)?@tI-kFTO05R^h#t>?e#84R5sWsj9s=`@Rv0z z1toAgt&bk?3e3osPYg{uf^bBBn4TJ#LzF6}g(O8+nD<})!`oc*v}zbD$6<6LJfVQ@ zB1s?U=m{rU-aIwa;-Q^0?BI`jmh>t8P8VH*Wq5hZ@@N8oZR>nuC>5{OlUaCBu(1Q? zjxVELmQn~7o|9JT_v?Ovc<{GO832n{*Q%)HE3?yg5`~YY{yi6qMY48m2g%OvNY4z_ z`+^LGG-wz%?kfqFIR|efDGdk=6G2u$%J1@@=qNw_ET2rIWI% z&5t=+c4;YyAq|&+6UiOSs~0ltCt{3=4UNuM`p;6SbKQ7fM?|>&w%f1W%vGKvlAL!# z#{w3gjb~pIMRUZq?UY^RYm+s!E;U+KEjcRgdTK9L>w+V)!~5=UQ|I5(R$Z4AV@aDWbzC?M<>y65U2udoB> z+=WeJ-=Uofz}^k$GW~^1mZE8s^?2lvWVp{9Q_`flT93%FP%gu#o%Qmc$2<=JD(Z{a zCo*c4yoasiTm9#^ax;0)A**?DgqSMB;_PV6zRgNniZBU+dM~^hzw_1@XY8gP#@j() zICm|gnkpiGr}I$qg2YWkxb-Dvruxv*d4Hq+P#c$!;uAX{@~vjoTO>J96|aU zO&3ypcHGP5&+$ooWylHSr;g3|jfT0OBtJfmT$vKwARR~=H$Q2^Hjnh^c>k`kC*^8m ze6mbl@c7HbM1WxQ}G07i@U&X^$?SxND{OUN|SuVV4(RrckfI8}zpb zf|cXWh#|JS`=*xY#XYwjmvsV*!+m}WQ>m05UV#R7s^gYVg}nUJ5f#8Qw-3&|OXV^G z(o48kC5KL%{9Xe}q^EUd9j%$cZ5P6MwLOt8&x6HpFem1^w6j^c>qfa1dvSxc95KN3 z)Oi8h&37{1hb-ieFwb1a)-NNIO6)|PmI)l)&*b1k_SbvH%}g?~A32dO^!kQ^mr=nEJ7e zm!{`qcU|M!xx3^f%0C<4n6LZ4$rWRBAbH|)f|j$B&i#y0rZKt6%49Qs8^I{F|Lc)J z%0a`U;mB%OyNiIWD-|gO2=GmeRNM$7^XGV{*7*VyMv*h;v^kr>b*|k4X5N0h@VE54 zStz%A7i7>x$`%Xh*eM8y6zEUKgnS1oN`iODjC>m9{(2k6DuXAzU9?V^0_TPXq;dDv z1y_an$Qfn7YG1pFZsZ;*sY59&nlOuwRB$m`lodx5!YL>nzK=WvrtJfSj8x&A-Kh2tN>+wnXAt* z&{>j;&J3IT!Oi-l(hS~|;C&|8sUCHGyfBLXq5o*rySRDG2*E9{-KyApjrCcMhWn1+ z1fQ8NbkO(U`k9GGEdUu1J%ww<4a3H4k&ATHzV+N}&lSw!?NMLjmq_#er10JqC*;Rq z(^2KON5^u8M5Nd~QT|T*aVWQSmpetz4BdMdE^ZlTd2|~Dc{M_cduaeKzl=&Xg=8o# zMSrQV2Ki%rWlQ&Z<)$YIQ+ZV7OZ7DOCuIQ$LfIIEy+!)wE?|DTkNiC`l_s0!g+o7wEB!+4pIP^gP2j(atjPQ1S?n&NUSaIBlYT{!k%kHOlJ3(W1FOi0e=M zJ;(hlUKFF>e+lAjv|#GR7wYXShUP4LM$91R$FxxE&<8iagTirgkb;o-mPX!CaDEx4 z6J-CjibQO!bB{~|InDu9iT3w@b)5eL{;+b!le}#*SGW4Ha@Q@50}SensYi zb)bFpVn<2$ofOb)og2-v`-3dS`+phw;G2mJ%TY|#u2Q{*wr*MiH8#VCG~u);p<>U~ zrUqq2nl6Cev5y0~h8%=&tF8+Symddm{uI78gw_kR>K(x=h=N}8tEQPL{J>^G%wm2%u{m^oJ zYy-*U_KxV#*o~X5@8&q!*eBZPLmLNuxWD}18*$o|&q;k;l3q}j#1`?ySUlOQvEh?d zFVGsePPatGI2nHPb7XY%GUrSJe4-A0+*#f_xO-bG@-oLfe5`@`HThO*Hw&SGODS!& z&-fmtyDetX8c0$NK)hk+9Ix`CUO^&kAzSTv~dUYg@B^p9ru$N$}|?1t*o9R~Qw=;oaN zM}k_QhC_c31pnd{uv9(o4x;1-mm*-V&vah zYw*8$w(05i(U1w@?S3`w=Cf08|K2UY0QaEq`QPvFvD*1%5r6YnLnrvJ^8LM!z`cb3 z+{GoqKAd4Zc9e}Dy}pGRDoM&1@ z^GkmJ?mw&N2+SJOu{N5|-Nf^9H>rQTP~-P$zeD22*L7AUbGb92i@80R%=mIywieNt zw?-q!8;&>Yvy#_}3@e4;C z^g@}L?A6xJxfl_K^LBI7C%cy*Ucc(*GO*bEGc;27#f&?UGoCkIAvWKJ|Cop+9*T0| z?{@HcuNn_F-wnqimg{#m@}=Rf z)7{(MI0E}QJM{h9>wny3xfho(8gfRzJ*M%1=r0b6Tb8`q#(+C zR=`#KRhoGyFl@7fc)RMTv^rG!h~jo{SJdt%BG|Z1vy~%lK3v+XaRO1KS>u_?0<1_@ zsK~~y+=BGw;(K5F2A{RNnTzTCl^ox*ovVA;AgS2SZN-1$Hmt98aHk7WM1^oUe|4N5 zYI*#2{fVjfiM^U@mkJFW*SIZUJkCbLs%7jSEB86l)Q|4Xd(x#mM842@x_u;kX;1p8 zFG=H`JNfG?T_`KG<7L9Gok-_{+tY&J?uc8D%0Yw8Zsi_<<=mKa^l1jcI;RzWw^C)H{g&@d6E$U~;kDV%^5;%hn}v9AVokuaJjwbWz@$ znO0(Xz|rk3Cmsp?PRtG6G@8~JYw`GC(He16ETv<-F!TcJX}CX0u{VB}G|bHi{TIR0 zF2NUbe`--l;!5}pHeR!ma-4o9Cf&|h%un)P6rpL^^i+E#M>XMp=|kta+le)JjQ~gJ z$avnu$^Wu)Jp6xAyTQ}#4hZHQ{!9RxcKvUZ`M+ig{&RP$O+?Of=2Gzd9Y}m69eLkv z^4{P%wY40EO2HbF&08Iq8%1s8Zcgxi-Q4892ZecC^-G-Qd254Qc zzS#B%3>1dn3Rw{$F4}g=Z@4qzkmm?a)gaDAF_RK?pKm)-`7J9STxY0^X{9hM(3xBQ zZ+<+;9$`$3Oxq`VL3;#-r>C=i_;`=>oNvOJ$(P7Mbqx2u3rkliAQ8n%Oc!Qwh@1w zAiZ2XIT-piIfCJqvgf-oaj}Z_3KhB7Lxn`uvr<>R!y!u!QK00N8s&}ba))mU6gMyH zr`IDc&}T1EkDOe%J5>=(pC7N?GSI7`--5O&gXJXZm4gkK;r>}b#NCELIhoSSz zMB5D`D@lo!3u98lG62B7bX%j`r0-VNQgPxie*|Pmqmytb|52ppSF~OVz@;PmOuPM; z!!ZYWx@JvX4EawJ@>ut4NfnwY0P@qAy5f*gE<8hhcZP$t=>jFBcdoWFbo>x`!!R3H z*#!dq%&dEFP;b82Ek^pV*n9pjeCZ#g*GMmm1O+`O2W!RJarRHRzwmU>1n!HD8sQ4b zflau$?Qbg2l|?GfS%mSo&{$TuhU0#J(pV+ix#lyg)SmRjP-T~?d_xNi|FGqlk$nfnj8EXN8W2i`0Cr zeC)yLAdggad2`7%zE-)2-AObve-bW)a~Cj*jx&LR+u=1I1x`CJ|SRR#+?B*@X3sFix*l-?GcC43eTAxL$8;c zVo=Y!r!9K;Y^V*5FUtrMvtAnMPJt1 zt1r$2^sft1wwW!gv&pwl>(vymW@DL$&x$EFkSd4a8!KY8!!0Y>R@I(J2u^yC#wb>; zD|X4!5bDN}P7*R@ff+16$cDr>_I-=GA{omorV8yNx(1{p?3tM;d;V5MBvT=rj!?(& zO?g?v4c!KdGEUyAhx`}94|QyTg106jN!>0F0cik^XU?Sl0cbkT2XtS+RP9_jIl~(5 z(v}X;V~|aG<_x^TLf@j$O@~PLPr~NNn+KZi0K5V0#hD35#0di8vo~H_@@rf?{$n;( zjTbrJT}Q-kvB$8ZCCNH#DEy{1hFZjpuJBYrVmE0h9zoF1#YiuD@rzTXXr4?NDIdH( zpHP58j@=zxj1z>La=8vnK_7Bw!vEFFm4CB=uHj6_nCWe+h|$3{+KviCiy~D)O-o0{ zR#$5%K}F+eLKP8&m>RXT#1bW-}^l8`#i}&yYf<6I-rfDtac+J<>T`Bo=G)8 zKxxW%i<)(*n-xJ;CHG6!Wd+8W!nc|YqypE?Y$^<-{cLd4Pdjah z9aMH=of`R@2~yy z;(q704~}qf09?#&FYfmAOErK_KPdEv(d5jD=FjwhR&OMi%bdJz?xvv}w89n}BF*3; zm7f$O^mpLmODOA?*4c?oLt!h!pr|r(iQD)}*Hh@4!j1qkaj35{9FfM#pE*HHJpC{y zJ@&0;&^FMaLEj>L3m?u*1+W>>j^Y>8g6NXFrT3?$;Oqn4?nekVTNMm}S+T@!T0z(j zwh|m4fdVDO<66G;;@pMxzKPH9=S=a$_no@%~tWWt3x(a0VGLi7DB69$VTkk_{%dEIrS& zG0Tl@q{`{g-y7qtc?PV_`JN3>%~%vWLFLx2r5fE!-sKO&=vncljZ7<4^vpMFi4>OF zcA?m)J#}`nou%7$YTYikl!@O7%y=u$6uMK9V_^GnwMUgS#yh8|Dpt|rv~$jhMA!$W z^x;iF=P0}7Xe@BPv$Ga7J4nk8FX?unQ(tx+)d0;K^YhAkx6}9I6hfUMex?oZPLEkA z!tf;a9@jO-y1NpteTPVUGZlQHilQ%WII8!|oZ;KdM)Krtl-8bB3Vbir1gZA2KTpRfB67e6c z?gpT7x`h5Yk8*CSW9 zhdkp3(?!&X62hYb*BYz(?;Ep9J8lf^|+69&w^GM!uUN8$`+*gLG3iGu%ke?hJ zFG9t@Rt1~!V@*H|N|rRo1ico==p*dY%v57w+>Iv*Vy@yUoUK14%i0mN!YSf-xzcS* zI~z6Hqe?a9*N&MDH^V500^Sj(yjp8DnEEzLsIH{w2l-RrIXa?3eJAF{AwY=3s#&jU z;X(7VuPFP0nbT5TXhw)v(Iyk@R)oaGXe})VA0~$rTxqd43M zS_($0e;QF{GBz}d3-7-54dll68?G3P^xy!1 zF}CtCJuNt;Dn8<_*NhFq#JJ&wI#9p;H65lJG}tGBAE_5aA%vzd64V?kg?RC>xmy+~ zr5f9wbb5nz^&HnOj=k2dW~ssAg|kV{NFI6(6332n=LvsYQr{XRrHp`(eC8QmCfsOy zi@p^aJ|^7aD9;sM9Y_|v_w#7DR`Iv<0gZFS?xWe{l$!yP2Wtsdtp+(FY`Wvk8DCy( zJx?@Je>wSL?SMg>Gzi7b7!!^}M(kZ^Tar5L!}$`<%QZQckpg#b2<{M%$L|AVA^h@l z-FFb@!B>cWJ1P2Wx1?qyPzG?=bi(4F5-g14iJK9V1o8ueWRm=@aRJREW*( zKSFy+@XQT36Ck=a1fDY?zWB{_+uP9rl0w@c%z@%YSgJF4KSR9{#e!qQvJq Q%X<$k)Wy@e_Iya%p8;2~#sB~S diff --git a/images/decomp.png b/images/decomp.png deleted file mode 100644 index 6c2f7fd42b5614559436742321b4312af0c9be9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4111 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 X8*B$sRVxKA0AO+1+Pv(dTkO98?=01g diff --git a/images/decomp2.png b/images/decomp2.png deleted file mode 100644 index 07646eb20e7516b3c3cda16d583fa7d633648e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7066 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 K9L__zUi%*g@K+!J literal 0 HcmV?d00001 diff --git a/images/mergen_disass.png b/images/mergen_disass.png new file mode 100644 index 0000000000000000000000000000000000000000..61a646e97371adcdf916687ec8baf6a4c432abbe GIT binary patch literal 6462 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 literal 0 HcmV?d00001 diff --git a/images/mergen_run.png b/images/mergen_run.png deleted file mode 100644 index 7377d35436e94eca64765943f43906f70aac2774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10427 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 QXz#e4@;upa{7TyY0O>a+rT_o{ diff --git a/images/org_decomp.png b/images/org_decomp.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc31327a1cbb3fd67e2fca7895367d8a309603b GIT binary patch literal 3059 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 NfVyCDz8dKq^KUdqgLwb| literal 0 HcmV?d00001 diff --git a/images/org_disass.png b/images/org_disass.png new file mode 100644 index 0000000000000000000000000000000000000000..5d693907276e3ccc15b35b08d4eb16a6d36c3c69 GIT binary patch literal 9786 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 GqyG=2G(zA2 literal 0 HcmV?d00001 diff --git a/images/run_mergen.PNG b/images/run_mergen.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d633cafcc7760a100070663069a85019186d75e3 GIT binary patch literal 10475 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 literal 0 HcmV?d00001 diff --git a/images/running_mergen.png b/images/running_mergen.png deleted file mode 100644 index f24d846fd0dd1589252dd6189f55d874953d6289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14388 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 A!2kdN diff --git a/images/vmp_settings.png b/images/vmp_settings.png deleted file mode 100644 index 7b24f3425c65c700d863f50ef6c8940da76d1ebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8791 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 diff --git a/images/vmp_settings1.png b/images/vmp_settings1.png new file mode 100644 index 0000000000000000000000000000000000000000..f187a0f4d6afe3b687a357289f2d75a7cf6e9c0f GIT binary patch literal 14524 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
    uAZJ~MRH8CkHCLFf;K4oue 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 O2&Sx|RH*p$)qex|i6D#s literal 0 HcmV?d00001 diff --git a/images/vmp_settings2.png b/images/vmp_settings2.png index 3e21dda37ee6250cb7f090f75041f3506f077adb..b243f62479e56f37609be9ca1a756d88ac0c911d 100644 GIT binary patch literal 8533 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 literal 10873 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 SDL^>{Q+fcupL@^r<^KRAW1)Ni diff --git a/images/vmp_ultra_asm.png b/images/vmp_ultra_asm.png deleted file mode 100644 index c32d04f39095ee67adaa2f44200c80b5d285e62d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18922 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 diff --git a/lifter/OperandUtils.cpp b/lifter/OperandUtils.cpp index dcdb9fe..37786fa 100644 --- a/lifter/OperandUtils.cpp +++ b/lifter/OperandUtils.cpp @@ -16,20 +16,42 @@ void initBases2(void* file_base, ZyanU8* data) { #define TESTFOLDER4 #define TESTFOLDER5 #define TESTFOLDER6 +#define TESTFOLDER7 +#define TESTFOLDER8 #define TESTFOLDERshl #define TESTFOLDERshr #endif -KnownBits analyzeValueKnownBits(llvm::Value* value, const llvm::DataLayout& DL) { - KnownBits knownBits; - +KnownBits analyzeValueKnownBits(Value* value, const DataLayout& DL) { + KnownBits knownBits(64); + knownBits.resetAll(); if (value->getType() == Type::getInt128Ty(value->getContext())) return knownBits; - computeKnownBits(value, knownBits, DL, 0); - return knownBits; + + + return computeKnownBits(value, DL, 3); } +Value* simplifyValue(Value* v, const DataLayout& DL) { + + if (!isa(v)) + return v; + + Instruction* inst = cast(v); + + + SimplifyQuery SQ(DL,inst); + + if (auto x = simplifyInstruction(inst, SQ)) { + /* + if (isa(x)) // if poison it should be 0 for shifts, can other operations generate poison without a poison value anyways? + return ConstantInt::get(v->getType(), 0); + */ + return x; + } + return v; +} Value* createSelectFolder(IRBuilder<>& builder, Value* C, Value* True, Value* False, const Twine& Name = "") { #ifdef TESTFOLDER @@ -44,8 +66,9 @@ Value* createSelectFolder(IRBuilder<>& builder, Value* C, Value* True, Value* Fa } } } -#endif - return builder.CreateSelect(C, True, False, Name); +#endif + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + return simplifyValue(builder.CreateSelect(C, True, False, Name), DL); } Value* createAddFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& Name = "") { #ifdef TESTFOLDER3 @@ -57,7 +80,8 @@ Value* createAddFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine if (RHSConst->isZero()) return LHS; } #endif - return builder.CreateAdd(LHS, RHS, Name); + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + return simplifyValue( builder.CreateAdd(LHS, RHS, Name), DL); } Value* createSubFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& Name = "") { @@ -65,8 +89,9 @@ Value* createSubFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine if (ConstantInt* RHSConst = dyn_cast(RHS)) { if (RHSConst->isZero()) return LHS; } -#endif - return builder.CreateSub(LHS, RHS, Name); +#endif + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + return simplifyValue( builder.CreateSub(LHS, RHS, Name) , DL); } Value* foldLShrKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { @@ -76,7 +101,20 @@ Value* foldLShrKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { if (RHS.hasConflict() || LHS.hasConflict() || !RHS.isConstant() || RHS.getBitWidth() > 64 || LHS.isUnknown() || LHS.getBitWidth() <= 1) return nullptr; - auto result = KnownBits::lshr(LHS, RHS); + + APInt shiftAmount = RHS.getConstant(); + unsigned shiftSize = shiftAmount.getZExtValue(); + + if (shiftSize >= LHS.getBitWidth()) + return ConstantInt::get(Type::getIntNTy(context, LHS.getBitWidth()), 0);; + + KnownBits result(LHS.getBitWidth()); + result.One = LHS.One.lshr(shiftSize); + result.Zero = LHS.Zero.lshr(shiftSize) | APInt::getHighBitsSet(LHS.getBitWidth(), shiftSize); + + if (!(result.Zero | result.One).isAllOnes()) { + return nullptr; + } return ConstantInt::get(Type::getIntNTy(context, LHS.getBitWidth()), result.getConstant()); } @@ -85,16 +123,30 @@ Value* foldShlKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { if (RHS.hasConflict() || LHS.hasConflict() || !RHS.isConstant() || RHS.getBitWidth() > 64 || LHS.isUnknown() || LHS.getBitWidth() <= 1) return nullptr; - auto result = KnownBits::shl(LHS, RHS); + APInt shiftAmount = RHS.getConstant(); + unsigned shiftSize = shiftAmount.getZExtValue(); + + if (shiftSize >= LHS.getBitWidth()) + return ConstantInt::get(Type::getIntNTy(context, LHS.getBitWidth()), 0); + + KnownBits result(LHS.getBitWidth()); + result.One = LHS.One.shl(shiftSize); + result.Zero = LHS.Zero.shl(shiftSize) | APInt::getLowBitsSet(LHS.getBitWidth(), shiftSize); + + if (result.hasConflict() || !result.isConstant()) { + return nullptr; + } return ConstantInt::get(Type::getIntNTy(context, LHS.getBitWidth()), result.getConstant()); } Value* createShlFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& Name = "") { + + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); #ifdef TESTFOLDERshl - llvm::DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + KnownBits KnownLHS = analyzeValueKnownBits(LHS, DL); KnownBits KnownRHS = analyzeValueKnownBits(RHS, DL); @@ -106,15 +158,15 @@ Value* createShlFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine #endif - - return builder.CreateShl(LHS, RHS, Name); + return simplifyValue( builder.CreateShl(LHS, RHS, Name), DL); } Value* createLShrFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& Name = "") { + + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); #ifdef TESTFOLDERshr - llvm::DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); KnownBits KnownLHS = analyzeValueKnownBits(LHS, DL); KnownBits KnownRHS = analyzeValueKnownBits(RHS, DL); @@ -126,8 +178,7 @@ Value* createLShrFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twin #endif - - return builder.CreateLShr(LHS, RHS, Name); + return simplifyValue(builder.CreateLShr(LHS, RHS, Name),DL); } Value* createShlFolder(IRBuilder<>& builder, Value* LHS, uintptr_t RHS, const Twine& Name = "") { @@ -150,7 +201,7 @@ Value* createLShrFolder(IRBuilder<>& builder, Value* LHS, APInt RHS, const Twine Value* foldOrKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { - if (RHS.hasConflict() || LHS.hasConflict() || LHS.isUnknown() || RHS.isUnknown() || LHS.getBitWidth() != RHS.getBitWidth() || !RHS.isConstant() || LHS.getBitWidth() <= 1 || RHS.getBitWidth() <= 1 || RHS.getBitWidth() > 64 || LHS.getBitWidth() > 64) { + if (RHS.hasConflict() || LHS.hasConflict() || LHS.isUnknown() || RHS.isUnknown() || LHS.getBitWidth() != RHS.getBitWidth() || !RHS.isConstant() || LHS.getBitWidth() <= 1 || RHS.getBitWidth() < 1 || RHS.getBitWidth() > 64 || LHS.getBitWidth() > 64) { return nullptr; } @@ -160,7 +211,7 @@ Value* foldOrKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { combined.One = LHS.One | RHS.One; combined.Zero = LHS.Zero & RHS.Zero; - if (!(combined.Zero | combined.One).isAllOnes() || combined.getBitWidth() <= 1) { + if (!combined.isConstant() || combined.hasConflict()) { return nullptr; } @@ -170,6 +221,7 @@ Value* foldOrKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { Value* createOrFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& Name = "") { + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); #ifdef TESTFOLDER5 if (ConstantInt* LHSConst = dyn_cast(LHS)) { @@ -178,7 +230,6 @@ Value* createOrFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& if (ConstantInt* RHSConst = dyn_cast(RHS)) { if (RHSConst->isZero()) return LHS; } - llvm::DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); KnownBits KnownLHS = analyzeValueKnownBits(LHS, DL); KnownBits KnownRHS = analyzeValueKnownBits(RHS, DL); @@ -192,11 +243,25 @@ Value* createOrFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& #endif - - return builder.CreateOr(LHS, RHS, Name); + return simplifyValue( builder.CreateOr(LHS, RHS, Name),DL ); } +Value* foldXorKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { + + + if (RHS.hasConflict() || LHS.hasConflict() || LHS.isUnknown() || RHS.isUnknown() || !RHS.isConstant() || LHS.getBitWidth() != RHS.getBitWidth() || RHS.getBitWidth() <= 1 || LHS.getBitWidth() <= 1 || RHS.getBitWidth() > 64 || LHS.getBitWidth() > 64) { + return nullptr; + } + + if (!((LHS.Zero | LHS.One) & RHS.One).eq(RHS.One)) { + return nullptr; + } + APInt resultValue = LHS.One ^ RHS.One; + + return ConstantInt::get(Type::getIntNTy(context, LHS.getBitWidth()), resultValue); +} + Value* createXorFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine& Name = "") { #ifdef TESTFOLDER6 @@ -206,8 +271,18 @@ Value* createXorFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine if (ConstantInt* RHSConst = dyn_cast(RHS)) { if (RHSConst->isZero()) return LHS; } + + #endif - return builder.CreateXor(LHS, RHS, Name); + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + KnownBits KnownLHS = analyzeValueKnownBits(LHS, DL); + KnownBits KnownRHS = analyzeValueKnownBits(RHS, DL); + + + if (auto V = foldXorKnownBits(builder.getContext(), KnownLHS, KnownRHS)) + return V; + + return simplifyValue(builder.CreateXor(LHS, RHS, Name), DL); } std::optional foldKnownBits(CmpInst::Predicate P, KnownBits LHS, KnownBits RHS) { @@ -239,7 +314,7 @@ std::optional foldKnownBits(CmpInst::Predicate P, KnownBits LHS, KnownBits } Value* createICMPFolder(IRBuilder<>& builder, CmpInst::Predicate P, Value* LHS, Value* RHS, const Twine& Name = "") { - llvm::DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); KnownBits KnownLHS = analyzeValueKnownBits(LHS, DL); KnownBits KnownRHS = analyzeValueKnownBits(RHS, DL); @@ -247,7 +322,7 @@ Value* createICMPFolder(IRBuilder<>& builder, CmpInst::Predicate P, Value* LHS, return ConstantInt::get(Type::getInt1Ty(builder.getContext()), v.value()); } - return builder.CreateICmp(P, LHS, RHS, Name); + return simplifyValue( builder.CreateICmp(P, LHS, RHS, Name), DL); } Value* foldAndKnownBits(LLVMContext& context, KnownBits LHS, KnownBits RHS) { @@ -280,7 +355,7 @@ Value* createAndFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine if (RHSConst->isMinusOne()) return LHS; } */ - llvm::DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); KnownBits KnownLHS = analyzeValueKnownBits(LHS, DL); KnownBits KnownRHS = analyzeValueKnownBits(RHS, DL); @@ -292,38 +367,35 @@ Value* createAndFolder(IRBuilder<>& builder, Value* LHS, Value* RHS, const Twine } #endif - return builder.CreateAnd(LHS, RHS, Name); + return simplifyValue( builder.CreateAnd(LHS, RHS, Name), DL); } // - probably not needed anymore Value* createTruncFolder(IRBuilder<>& builder, Value* V, Type* DestTy, const Twine& Name = "") { Value* resulttrunc = builder.CreateTrunc(V, DestTy, Name); + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); #ifdef TESTFOLDER7 - llvm::DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); + KnownBits KnownRHS = analyzeValueKnownBits(resulttrunc, DL); - printvalue(resulttrunc) - printvalue(V) - printvalue2(KnownRHS) if (!KnownRHS.hasConflict() && KnownRHS.getBitWidth() > 1 && KnownRHS.isConstant()) return ConstantInt::get(DestTy, KnownRHS.getConstant()); #endif - return resulttrunc; + return simplifyValue(resulttrunc, DL); } -// - probably not needed anymore -Value* createZExtFolder(IRBuilder<>& builder, Value* V, Type* DestTy, const Twine& Name = "") { + +Value* createZExtFolder(IRBuilder<>& builder, Value* V, Type* DestTy, const Twine& Name = "") { + auto resultzext = builder.CreateZExt(V, DestTy, Name); + DataLayout DL(builder.GetInsertBlock()->getParent()->getParent()); #ifdef TESTFOLDER8 - if (V->getType() == DestTy) { - return V; - } - - - + KnownBits KnownRHS = analyzeValueKnownBits(resultzext, DL); + if (!KnownRHS.hasConflict() && KnownRHS.getBitWidth() > 1 && KnownRHS.isConstant()) + return ConstantInt::get(DestTy, KnownRHS.getConstant()); #endif - return builder.CreateZExt(V, DestTy, Name); + return resultzext; } @@ -394,30 +466,30 @@ IntegerType* getIntSize(int size, LLVMContext& context) { switch (size) { case 1: { - return llvm::Type::getInt1Ty(context); + return Type::getInt1Ty(context); } case 8: { - return llvm::Type::getInt8Ty(context); + return Type::getInt8Ty(context); } case 16: { - return llvm::Type::getInt16Ty(context); + return Type::getInt16Ty(context); } case 32: { - return llvm::Type::getInt32Ty(context); + return Type::getInt32Ty(context); } case 64: { - return llvm::Type::getInt64Ty(context); + return Type::getInt64Ty(context); } case 128: { - return llvm::Type::getInt128Ty(context); + return Type::getInt128Ty(context); } default: { - return llvm::Type::getIntNTy(context, size); + return Type::getIntNTy(context, size); } } @@ -426,8 +498,8 @@ IntegerType* getIntSize(int size, LLVMContext& context) { void Init_Flags(LLVMContext& context, IRBuilder<>& builder) { - auto zero = ConstantInt::getSigned(llvm::Type::getInt1Ty(context), 0); - auto one = ConstantInt::getSigned(llvm::Type::getInt1Ty(context), 1); + auto zero = ConstantInt::getSigned(Type::getInt1Ty(context), 0); + auto one = ConstantInt::getSigned(Type::getInt1Ty(context), 1); FlagList[FLAG_CF] = zero; FlagList[FLAG_PF] = zero; @@ -445,9 +517,7 @@ void Init_Flags(LLVMContext& context, IRBuilder<>& builder) { Value* setFlag(LLVMContext& context, IRBuilder<>& builder, Flag flag, Value* newValue = nullptr) { newValue = createTruncFolder(builder,newValue, Type::getInt1Ty(context)); -#ifdef _DEVELOPMENT - outs() << "flag set: " << flag << " "; newValue->print(outs()); outs() << "\n"; outs().flush(); -#endif + if (flag == FLAG_RESERVED1 || flag == FLAG_RESERVED5 || flag == FLAG_IF @@ -455,7 +525,7 @@ Value* setFlag(LLVMContext& context, IRBuilder<>& builder, Flag flag, Value* new ) return nullptr; - auto one = ConstantInt::getSigned(llvm::Type::getInt1Ty(context), 1); + auto one = ConstantInt::getSigned(Type::getInt1Ty(context), 1); return FlagList[flag] = newValue; @@ -463,7 +533,7 @@ Value* setFlag(LLVMContext& context, IRBuilder<>& builder, Flag flag, Value* new Value* getFlag(LLVMContext& context, IRBuilder<>& builder, Flag flag) { if (FlagList[flag]) return FlagList[flag]; - return ConstantInt::getSigned(llvm::Type::getInt1Ty(context), 0); + return ConstantInt::getSigned(Type::getInt1Ty(context), 0); } @@ -476,8 +546,8 @@ Value* getFlag(LLVMContext& context, IRBuilder<>& builder, Flag flag) { void Init_Flags2(LLVMContext& context, IRBuilder<>& builder) { - auto zero = (ConstantInt*)llvm::ConstantInt::getSigned(llvm::Type::getInt64Ty(context), 0); - auto value = (ConstantInt*)llvm::ConstantInt::getSigned(llvm::Type::getInt64Ty(context), 2); + auto zero = (ConstantInt*)ConstantInt::getSigned(Type::getInt64Ty(context), 0); + auto value = (ConstantInt*)ConstantInt::getSigned(Type::getInt64Ty(context), 2); auto flags = RegisterList[ZYDIS_REGISTER_RFLAGS]; @@ -505,6 +575,7 @@ void initMemoryAlloc(Value* allocArg) { memoryAlloc = allocArg; } +// replace it so that we can select we want rcx, rdx, r8, r9 and rest pushed to stack or everything is unknown unordered_map InitRegisters(LLVMContext& context, IRBuilder<>& builder,Function* function, ZyanU64 rip) { int zydisRegister = ZYDIS_REGISTER_RAX; @@ -518,7 +589,7 @@ unordered_map InitRegisters(LLVMContext& context, IRBuilder<>& buil continue; } - llvm::Argument* arg = &*argIt; + Argument* arg = &*argIt; arg->setName(ZydisRegisterGetString((ZydisRegister)zydisRegister)); if (std::next(argIt) == argEnd) { @@ -536,8 +607,8 @@ unordered_map InitRegisters(LLVMContext& context, IRBuilder<>& buil - auto zero = (ConstantInt*)llvm::ConstantInt::getSigned(llvm::Type::getInt64Ty(context), 0); - auto value = (ConstantInt*)llvm::ConstantInt::getSigned(llvm::Type::getInt64Ty(context), rip); + auto zero = (ConstantInt*)ConstantInt::getSigned(Type::getInt64Ty(context), 0); + auto value = (ConstantInt*)ConstantInt::getSigned(Type::getInt64Ty(context), rip); auto new_rip = createAddFolder(builder,zero, value); @@ -546,7 +617,7 @@ unordered_map InitRegisters(LLVMContext& context, IRBuilder<>& buil - auto stackvalue = (ConstantInt*)llvm::ConstantInt::getSigned(llvm::Type::getInt64Ty(context), STACKP_VALUE); + auto stackvalue = (ConstantInt*)ConstantInt::getSigned(Type::getInt64Ty(context), STACKP_VALUE); auto new_stack_pointer = createAddFolder(builder,stackvalue, zero); RegisterList[ZYDIS_REGISTER_RSP] = new_stack_pointer; @@ -824,8 +895,8 @@ Value* GetEffectiveAddress(LLVMContext& context, IRBuilder<>& builder, ZydisDeco #include #include -using namespace llvm; +// replace it with https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/Analysis/MemoryLocation.h#L228 but I think this might be better after build, not while building class ValueByteReference { public: Value* value; @@ -862,7 +933,8 @@ public: } } - Value* retrieveCombinedValue(llvm::IRBuilder<>& builder, unsigned startAddress, unsigned byteCount) { + Value* retrieveCombinedValue(IRBuilder<>& builder, unsigned startAddress, unsigned byteCount) { + LLVMContext& context = builder.getContext(); if (byteCount == 0) return nullptr; @@ -888,6 +960,10 @@ public: return firstSource; } + // supposed to return 0 if never used, wtf? + if (firstSource == nullptr) { + return ConstantInt::get( Type::getIntNTy(context,byteCount), 0); + } Value* result = nullptr; @@ -895,12 +971,12 @@ public: unsigned currentAddress = startAddress + i; if (currentAddress < buffer.size() && buffer[currentAddress] != nullptr) { auto* ref = buffer[currentAddress]; - llvm::Value* byteValue = extractByte(builder, ref->value, ref->byteOffset); + Value* byteValue = extractByte(builder, ref->value, ref->byteOffset); if (!result) { result = createZExtFolder(builder,byteValue, Type::getIntNTy(builder.getContext(), byteCount * 8)); } else { - llvm::Value* shiftedByteValue = createShlFolder(builder, createZExtFolder(builder,byteValue, Type::getIntNTy(builder.getContext(), byteCount*8) ), llvm::APInt(byteCount * 8, i * 8)); + Value* shiftedByteValue = createShlFolder(builder, createZExtFolder(builder,byteValue, Type::getIntNTy(builder.getContext(), byteCount*8) ), APInt(byteCount * 8, i * 8)); result = createAddFolder(builder,result, shiftedByteValue,"extractbytesthing"); } } @@ -910,13 +986,13 @@ public: } private: - llvm::Value* extractByte(llvm::IRBuilder<>& builder, llvm::Value* value, unsigned byteOffset) { + Value* extractByte(IRBuilder<>& builder, Value* value, unsigned byteOffset) { if (!value) { return ConstantInt::get(Type::getInt8Ty(builder.getContext()), 0); } unsigned shiftAmount = byteOffset * 8; - llvm::Value* shiftedValue = createLShrFolder(builder,value, llvm::APInt(value->getType()->getIntegerBitWidth(), shiftAmount), "extractbyte"); + Value* shiftedValue = createLShrFolder(builder,value, APInt(value->getType()->getIntegerBitWidth(), shiftAmount), "extractbyte"); return createTruncFolder(builder,shiftedValue, Type::getInt8Ty(builder.getContext())); } }; @@ -941,10 +1017,10 @@ Value* GetOperandValue(LLVMContext& context, IRBuilder<>& builder, ZydisDecodedO case ZYDIS_OPERAND_TYPE_IMMEDIATE: { ConstantInt* val; if (op.imm.is_signed) { - val = (ConstantInt*)llvm::ConstantInt::getSigned(type, op.imm.value.s); + val = ConstantInt::getSigned(type, op.imm.value.s); } else { - val = llvm::ConstantInt::get(context, llvm::APInt(possiblesize, op.imm.value.u)); + val = ConstantInt::get(context, APInt(possiblesize, op.imm.value.u)); } return val; } @@ -1097,8 +1173,8 @@ Value* merge(LLVMContext& context, IRBuilder<>& builder, Value* existingValue, V } - llvm::APInt maskAPInt = llvm::APInt::getHighBitsSet(existingBitWidth, existingBitWidth - newBitWidth); - Value* mask = llvm::ConstantInt::get(context, maskAPInt); + APInt maskAPInt = APInt::getHighBitsSet(existingBitWidth, existingBitWidth - newBitWidth); + Value* mask = ConstantInt::get(context, maskAPInt); Value* maskedExistingValue = createAndFolder(builder,existingValue, mask, "maskedExistingValue"); diff --git a/lifter/Semantics.cpp b/lifter/Semantics.cpp index 88b7c2f..74fa150 100644 --- a/lifter/Semantics.cpp +++ b/lifter/Semantics.cpp @@ -5,45 +5,45 @@ // probably move this stuff somewhere else Value* computeOverflowFlagAdc(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* cf, Value* add ) { - auto cfc = builder.CreateZExtOrTrunc(cf, add->getType()); - auto ofAdd = builder.CreateAdd(add, cfc); - auto xor0 = builder.CreateXor(Lvalue, ofAdd); - auto xor1 = builder.CreateXor(Rvalue, ofAdd); - auto ofAnd = builder.CreateAnd(xor0, xor1); - return createICMPFolder(builder, CmpInst::ICMP_SLT, ofAnd, llvm::ConstantInt::get(ofAnd->getType(), 0)); + auto cfc = createZExtOrTruncFolder(builder,cf, add->getType()); + auto ofAdd = createAddFolder(builder,add, cfc); + auto xor0 = createXorFolder(builder,Lvalue, ofAdd); + auto xor1 = createXorFolder(builder,Rvalue, ofAdd); + auto ofAnd = createAndFolder(builder,xor0, xor1); + return createICMPFolder(builder, CmpInst::ICMP_SLT, ofAnd, ConstantInt::get(ofAnd->getType(), 0)); } Value* computeOverflowFlagAdd(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* add) { - auto xor0 = builder.CreateXor(Lvalue, add); - auto xor1 = builder.CreateXor(Rvalue, add); - auto ofAnd = builder.CreateAnd(xor0, xor1); + auto xor0 = createXorFolder(builder,Lvalue, add); + auto xor1 = createXorFolder(builder,Rvalue, add); + auto ofAnd = createAndFolder(builder,xor0, xor1); return createICMPFolder(builder, CmpInst::ICMP_SLT, ofAnd, ConstantInt::get(ofAnd->getType(), 0)); } -llvm::Value* computeOverflowFlagSub(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* sub) { - auto xor0 = builder.CreateXor(Lvalue, Rvalue); - auto xor1 = builder.CreateXor(Lvalue, sub); - auto ofAnd = builder.CreateAnd(xor0, xor1); +Value* computeOverflowFlagSub(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* sub) { + auto xor0 = createXorFolder(builder,Lvalue, Rvalue); + auto xor1 = createXorFolder(builder,Lvalue, sub); + auto ofAnd = createAndFolder(builder,xor0, xor1); return createICMPFolder(builder, CmpInst::ICMP_SLT, ofAnd, ConstantInt::get(ofAnd->getType(), 0)); } -llvm::Value* computeOverflowFlagSbb(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* cf, Value* sub) { - auto cfc = builder.CreateZExtOrTrunc(cf, sub->getType()); - auto ofSub = builder.CreateSub(sub, cfc); - auto xor0 = builder.CreateXor(Lvalue, Rvalue); - auto xor1 = builder.CreateXor(Lvalue, ofSub); - auto ofAnd = builder.CreateAnd(xor0, xor1); +Value* computeOverflowFlagSbb(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* cf, Value* sub) { + auto cfc = createZExtOrTruncFolder(builder,cf, sub->getType()); + auto ofSub = createSubFolder(builder,sub, cfc); + auto xor0 = createXorFolder(builder,Lvalue, Rvalue); + auto xor1 = createXorFolder(builder,Lvalue, ofSub); + auto ofAnd = createAndFolder(builder,xor0, xor1); return createICMPFolder(builder, CmpInst::ICMP_SLT, ofAnd, ConstantInt::get(ofAnd->getType(), 0)); } -llvm::Value* computeAuxFlagSbb(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* cf) { - auto ci15 = llvm::ConstantInt::get(Lvalue->getType(), 15); - auto and0 = builder.CreateAnd(Lvalue, ci15); - auto and1 = builder.CreateAnd(Rvalue, ci15); - auto sub = builder.CreateSub(and0, and1); +Value* computeAuxFlagSbb(IRBuilder<>& builder, Value* Lvalue, Value* Rvalue, Value* cf) { + auto ci15 = ConstantInt::get(Lvalue->getType(), 15); + auto and0 = createAndFolder(builder,Lvalue, ci15); + auto and1 = createAndFolder(builder,Rvalue, ci15); + auto sub = createSubFolder(builder,and0, and1); - auto cfc = builder.CreateZExtOrTrunc(cf, sub->getType()); - auto add = builder.CreateAdd(sub, cfc); + auto cfc = createZExtOrTruncFolder(builder,cf, sub->getType()); + auto add = createAddFolder(builder,sub, cfc); return createICMPFolder(builder, CmpInst::ICMP_UGT, add, ci15); } @@ -112,7 +112,7 @@ void jumpHelper(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledIns cout << "Which address do you want do jump?, check output_condition.ll file: "; - long long address; + long long address = 0; cin >> address; string block_name = "jumpsomewhere-" + to_string(instruction.runtime_address) + "-";; @@ -178,8 +178,8 @@ void branchHelper(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledI break; } case NOT_OPAQUE: { - llvm::ValueToValueMapTy VMap; - llvm::Function* conditionFunction = llvm::CloneFunction(function, VMap); + ValueToValueMapTy VMap; + Function* conditionFunction = CloneFunction(function, VMap); std::unique_ptr destinationModule = std::make_unique("destination_module", function->getContext()); conditionFunction->removeFromParent(); @@ -270,7 +270,7 @@ namespace mov { auto dest = instruction.operands[0]; auto src = instruction.operands[1]; - auto Rvalue = GetOperandValue(context, builder, src, src.size, to_string(instruction.runtime_address)); + auto Rvalue = GetOperandValue(context, builder, src, src.size, to_string(instruction.runtime_address));; if ((dest.type == ZYDIS_OPERAND_TYPE_MEMORY) && (src.type == ZYDIS_OPERAND_TYPE_IMMEDIATE) && (src.size < dest.size)) { @@ -297,7 +297,7 @@ namespace mov { printvalue(Rvalue); #endif - SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address)); + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; } @@ -343,7 +343,7 @@ void lift_cmovnbz(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledI Value* resultValue = createSelectFolder(builder,nbeCondition, Rvalue, Lvalue, "cmovnbe"); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); } @@ -361,7 +361,7 @@ void lift_cmovz(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledIns Value* resultValue = createSelectFolder(builder,zf, Rvalue, Lvalue, "cmovz"); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); } @@ -429,7 +429,7 @@ void lift_cmovnb(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledIn Value* resultValue = createSelectFolder(builder,builder.CreateNot(cf), Rvalue, Lvalue, "cmovnb"); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); } @@ -613,11 +613,11 @@ namespace branches { auto val = ConstantInt::getSigned(Type::getInt64Ty(context), 8); // assuming its x64 auto result = createSubFolder(builder,RspValue, val, "pushing_newrsp"); - SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address)); // sub rsp 8 first, + SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address));; // sub rsp 8 first, auto push_into_rsp = GetRegisterValue(context, builder, ZYDIS_REGISTER_RIP); - SetOperandValue(context, builder, rsp_memory, push_into_rsp, to_string(instruction.runtime_address)); // sub rsp 8 first, + SetOperandValue(context, builder, rsp_memory, push_into_rsp, to_string(instruction.runtime_address));; // sub rsp 8 first, string block_name = "jmp-call"; @@ -689,8 +689,8 @@ namespace branches { if (destination == 0) { // find first select -> go far back until a lib call/ operand -> print the instruction so we can analyse -> after analysing prompt option to select 0 or 1 - llvm::ValueToValueMapTy VMap; - llvm::Function* conditionFunction = llvm::CloneFunction(function, VMap); + ValueToValueMapTy VMap; + Function* conditionFunction = CloneFunction(function, VMap); std::unique_ptr destinationModule = std::make_unique("destination_module", function->getContext()); conditionFunction->removeFromParent(); @@ -830,8 +830,8 @@ namespace branches { (*run) = 0; } if (JOP == JOP_jmp_unsolved) { - llvm::ValueToValueMapTy VMap; - llvm::Function* conditionFunction = llvm::CloneFunction(function, VMap); + ValueToValueMapTy VMap; + Function* conditionFunction = CloneFunction(function, VMap); std::unique_ptr destinationModule = std::make_unique("destination_module", function->getContext()); conditionFunction->removeFromParent(); @@ -1301,6 +1301,8 @@ namespace arithmeticsAndLogical { ELSE OF is undefined; FI; */ + + // poison values created here void lift_rcl(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledInstruction& instruction) { auto dest = instruction.operands[0]; auto count = instruction.operands[1]; @@ -1312,7 +1314,8 @@ namespace arithmeticsAndLogical { auto* actualCount = builder.CreateURem(countValue, ConstantInt::get(countValue->getType(), dest.size), "actualCount"); auto* wideType = Type::getIntNTy(context, dest.size * 2); auto* wideLvalue = createZExtFolder(builder,Lvalue, wideType); - auto* shiftedInCF = createShlFolder(builder,createZExtFolder(builder,carryFlag, wideType), dest.size,"shiftedincf"); + auto cf_extended = createZExtFolder(builder, carryFlag, wideType); + auto* shiftedInCF = createShlFolder(builder,cf_extended, dest.size,"shiftedincf"); wideLvalue = createOrFolder(builder,wideLvalue, createZExtFolder(builder,shiftedInCF, wideType, "shiftedInCFExtended")); auto* leftShifted = createShlFolder(builder,wideLvalue, createZExtFolder(builder,actualCount, wideType, "actualCountExtended"),"leftshifted"); @@ -1328,6 +1331,18 @@ namespace arithmeticsAndLogical { auto* msbAfterRotate = createTruncFolder(builder,createLShrFolder(builder,result, dest.size - 1), Type::getInt1Ty(context),"rclmsbafterrotate"); auto* newOF = createSelectFolder(builder,createICMPFolder(builder, CmpInst::ICMP_EQ,actualCount, ConstantInt::get(actualCount->getType(), 1)), createXorFolder(builder,newCF, msbAfterRotate), getFlag(context, builder, FLAG_OF)); + printvalue(Lvalue) + printvalue(countValue) + printvalue(carryFlag) + printvalue(cf_extended) + printvalue(shiftedInCF) + printvalue(actualCount) + printvalue(wideLvalue) + printvalue(leftShifted) + printvalue(rightShifted) + printvalue(rotated) + printvalue(result) + SetOperandValue(context, builder, dest, result); setFlag(context, builder, FLAG_CF, newCF); setFlag(context, builder, FLAG_OF, newOF); @@ -1408,7 +1423,7 @@ namespace arithmeticsAndLogical { auto Rvalue = GetOperandValue(context, builder, dest, dest.size); Rvalue = builder.CreateNot(Rvalue, "realnot-" + to_string(instruction.runtime_address) + "-"); - SetOperandValue(context, builder, dest, Rvalue); + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; printvalue(Rvalue); // Flags Affected @@ -1522,14 +1537,14 @@ namespace arithmeticsAndLogical { Value* clampedCount = createAndFolder(builder, countValue, ConstantInt::get(countValue->getType(), maskC), "shlclamp"); Value* shiftedValue = builder.CreateAShr(Lvalue, clampedCount, "shr-lshr-" + to_string(instruction.runtime_address) + "-"); - Value* isZeroed = createICMPFolder(builder, CmpInst::ICMP_UGT, clampedCount, ConstantInt::get(clampedCount->getType(), bitWidth)); + Value* isZeroed = createICMPFolder(builder, CmpInst::ICMP_UGT, clampedCount, ConstantInt::get(clampedCount->getType(), bitWidth-1)); shiftedValue = createSelectFolder(builder, isZeroed, zero, shiftedValue); - auto* cfRvalue = builder.CreateSub(clampedCount, llvm::ConstantInt::get(clampedCount->getType(), 1)); - auto* cfShl = builder.CreateShl(llvm::ConstantInt::get(cfRvalue->getType(), 1), cfRvalue); - auto* cfAnd = builder.CreateAnd(cfShl, Lvalue); - auto* cfValue = createICMPFolder(builder, CmpInst::ICMP_NE, cfAnd, llvm::ConstantInt::get(cfAnd->getType(), 0)); + auto* cfRvalue = createSubFolder(builder,clampedCount, ConstantInt::get(clampedCount->getType(), 1)); + auto* cfShl = createShlFolder(builder,ConstantInt::get(cfRvalue->getType(), 1), cfRvalue); + auto* cfAnd = createAndFolder(builder,cfShl, Lvalue); + auto* cfValue = createICMPFolder(builder, CmpInst::ICMP_NE, cfAnd, ConstantInt::get(cfAnd->getType(), 0)); @@ -1541,6 +1556,7 @@ namespace arithmeticsAndLogical { Value* isNotZero = createICMPFolder(builder, CmpInst::ICMP_NE, clampedCount, zero); Value* oldcf = getFlag(context, builder, FLAG_CF); cfValue = createSelectFolder(builder, isNotZero, cfValue, oldcf); + cfValue = createSelectFolder(builder, isZeroed, zero, cfValue); Value* sf = computeSignFlag(builder, shiftedValue); Value* zf = computeZeroFlag(builder, shiftedValue); @@ -1558,7 +1574,7 @@ namespace arithmeticsAndLogical { setFlag(context, builder, FLAG_ZF, zf); setFlag(context, builder, FLAG_PF, pf); - SetOperandValue(context, builder, dest, shiftedValue, to_string(instruction.runtime_address)); + SetOperandValue(context, builder, dest, shiftedValue, to_string(instruction.runtime_address));; } @@ -1579,20 +1595,21 @@ namespace arithmeticsAndLogical { Value* shiftedValue = createLShrFolder(builder,Lvalue, clampedCount, "shr-lshr-" + to_string(instruction.runtime_address) + "-"); Value* zero = ConstantInt::get(countValue->getType(), 0); - Value* isZeroed = createICMPFolder(builder, CmpInst::ICMP_UGT, clampedCount, ConstantInt::get(clampedCount->getType(), bitWidth)); + Value* isZeroed = createICMPFolder(builder, CmpInst::ICMP_UGT, clampedCount, ConstantInt::get(clampedCount->getType(), bitWidth-1)); shiftedValue = createSelectFolder(builder, isZeroed, zero, shiftedValue); Value* cfValue = createTruncFolder(builder,createLShrFolder(builder,Lvalue, createSubFolder(builder,clampedCount, ConstantInt::get(clampedCount->getType(), 1)),"shrcf"), builder.getInt1Ty()); Value* isCountOne = createICMPFolder(builder, CmpInst::ICMP_EQ,clampedCount, ConstantInt::get(clampedCount->getType(), 1)); - Value* of = createICMPFolder(builder, CmpInst::ICMP_SLT, Lvalue, llvm::ConstantInt::get(Lvalue->getType(), 0)); + Value* of = createICMPFolder(builder, CmpInst::ICMP_SLT, Lvalue, ConstantInt::get(Lvalue->getType(), 0)); of = createSelectFolder(builder,isCountOne, of, getFlag(context, builder, FLAG_OF)); Value* isNotZero = createICMPFolder(builder, CmpInst::ICMP_NE, clampedCount, zero); Value* oldcf = getFlag(context, builder, FLAG_CF); cfValue = createSelectFolder(builder, isNotZero, cfValue, oldcf); + cfValue = createSelectFolder(builder, isZeroed, zero, cfValue); Value* sf = computeSignFlag(builder, shiftedValue); Value* zf = computeZeroFlag(builder, shiftedValue); Value* pf = computeParityFlag(builder, shiftedValue); @@ -1609,7 +1626,7 @@ namespace arithmeticsAndLogical { printvalue(isNotZero) printvalue(oldcf) printvalue(cfValue) - SetOperandValue(context, builder, dest, shiftedValue, to_string(instruction.runtime_address)); + SetOperandValue(context, builder, dest, shiftedValue, to_string(instruction.runtime_address));; } @@ -1631,7 +1648,7 @@ namespace arithmeticsAndLogical { Value* shiftedValue = createShlFolder(builder,Lvalue, clampedCountValue, "shl-shift"); Value* zero = ConstantInt::get(countValue->getType(), 0); - Value* isZeroed = createICMPFolder(builder, CmpInst::ICMP_UGT, clampedCountValue, ConstantInt::get(clampedCountValue->getType(), bitWidth)); + Value* isZeroed = createICMPFolder(builder, CmpInst::ICMP_UGT, clampedCountValue, ConstantInt::get(clampedCountValue->getType(), bitWidth-1)); shiftedValue = createSelectFolder(builder, isZeroed, zero, shiftedValue); Value* cfValue = createLShrFolder(builder,Lvalue, createSubFolder(builder,bitWidthValue, clampedCountValue),"shlcf"); @@ -1641,12 +1658,13 @@ namespace arithmeticsAndLogical { auto countIsNotZero = createICMPFolder(builder, CmpInst::ICMP_NE, clampedCountValue, ConstantInt::get(clampedCountValue->getType(), 0)); - auto cfRvalue = builder.CreateSub(clampedCountValue, llvm::ConstantInt::get(clampedCountValue->getType(), 1)); - auto cfShl = builder.CreateShl(Lvalue, cfRvalue); - auto cfIntT = llvm::cast(cfShl->getType()); - auto cfRightCount = llvm::ConstantInt::get(cfIntT, cfIntT->getBitWidth() - 1); - auto cfLow = builder.CreateLShr(cfShl, cfRightCount); + auto cfRvalue = createSubFolder(builder,clampedCountValue, ConstantInt::get(clampedCountValue->getType(), 1)); + auto cfShl = createShlFolder(builder,Lvalue, cfRvalue); + auto cfIntT = cast(cfShl->getType()); + auto cfRightCount = ConstantInt::get(cfIntT, cfIntT->getBitWidth() - 1); + auto cfLow = createLShrFolder(builder,cfShl, cfRightCount); cfValue = createSelectFolder(builder, countIsNotZero, createTruncFolder(builder,cfLow, Type::getInt1Ty(context)), getFlag(context, builder, FLAG_CF)); + cfValue = createSelectFolder(builder, isZeroed, zero, cfValue); Value* isCountOne = createICMPFolder(builder, CmpInst::ICMP_EQ,clampedCountValue, ConstantInt::get(clampedCountValue->getType(), 1)); @@ -1728,7 +1746,7 @@ namespace arithmeticsAndLogical { printvalue(Lvalue) printvalue(Rvalue) #endif - SetOperandValue(context, builder, dest, Rvalue); + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; SetOperandValue(context, builder, src, Lvalue); @@ -1767,7 +1785,7 @@ namespace arithmeticsAndLogical { setFlag(context, builder, FLAG_CF, cf); setFlag(context, builder, FLAG_OF, of); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); } @@ -1810,7 +1828,7 @@ namespace arithmeticsAndLogical { setFlag(context, builder, FLAG_CF, cf); setFlag(context, builder, FLAG_OF, of); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); } @@ -1826,7 +1844,7 @@ namespace arithmeticsAndLogical { #ifdef _DEVELOPMENT printvalue(Rvalue) #endif - SetOperandValue(context, builder, dest, Rvalue); + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; } @@ -2249,10 +2267,10 @@ printvalue(result) auto val = ConstantInt::getSigned(Type::getInt64Ty(context), 8); // assuming its x64 auto result = createSubFolder(builder,RspValue, val, "pushing_newrsp-" + to_string(instruction.runtime_address) + "-"); - SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address)); // sub rsp 8 first, + SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address));; // sub rsp 8 first, - SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address)); // then mov rsp, val + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; // then mov rsp, val } @@ -2269,10 +2287,10 @@ printvalue(result) auto val = ConstantInt::get(Type::getInt64Ty(context), 8); auto result = createSubFolder(builder,RspValue, val); - SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address)); // sub rsp 8 first, + SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address));; // sub rsp 8 first, - //pushFlags(context, builder, dest, Rvalue, to_string(instruction.runtime_address)); - SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address)); // then mov rsp, val + //pushFlags(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; // then mov rsp, val } @@ -2282,15 +2300,15 @@ printvalue(result) auto src = instruction.operands[2]; auto rsp = instruction.operands[1]; - auto Rvalue = GetOperandValue(context, builder, src, dest.size, to_string(instruction.runtime_address)); - auto RspValue = GetOperandValue(context, builder, rsp, dest.size, to_string(instruction.runtime_address)); + auto Rvalue = GetOperandValue(context, builder, src, dest.size, to_string(instruction.runtime_address));; + auto RspValue = GetOperandValue(context, builder, rsp, dest.size, to_string(instruction.runtime_address));; auto val = ConstantInt::getSigned(Type::getInt64Ty(context), 8); // assuming its x64 auto result = createAddFolder(builder,RspValue, val, "popping_new_rsp-" + to_string(instruction.runtime_address) + "-"); #ifdef _DEVELOPMENT printvalue(Rvalue) #endif - SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address)); // mov val, rsp first + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; // mov val, rsp first SetOperandValue(context, builder, rsp, result); // then add rsp 8 @@ -2303,14 +2321,14 @@ printvalue(result) auto src = instruction.operands[1]; // [rsp] auto rsp = instruction.operands[0]; // rsp - auto Rvalue = GetOperandValue(context, builder, src, dest.size, to_string(instruction.runtime_address)); - auto RspValue = GetOperandValue(context, builder, rsp, dest.size, to_string(instruction.runtime_address)); + auto Rvalue = GetOperandValue(context, builder, src, dest.size, to_string(instruction.runtime_address));; + auto RspValue = GetOperandValue(context, builder, rsp, dest.size, to_string(instruction.runtime_address));; auto val = ConstantInt::getSigned(Type::getInt64Ty(context), 8); // assuming its x64 auto result = createAddFolder(builder,RspValue, val, "popfq-" + to_string(instruction.runtime_address) + "-"); - SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address)); // mov val, rsp first - SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address)); // then add rsp 8 + SetOperandValue(context, builder, dest, Rvalue, to_string(instruction.runtime_address));; // mov val, rsp first + SetOperandValue(context, builder, rsp, result, to_string(instruction.runtime_address));; // then add rsp 8 @@ -2377,9 +2395,9 @@ printvalue(result) Value* sumValue = createAddFolder(builder,Lvalue, Rvalue, "xadd_sum-" + to_string(instruction.runtime_address) + "-"); - SetOperandValue(context, builder, dest, sumValue, to_string(instruction.runtime_address)); + SetOperandValue(context, builder, dest, sumValue, to_string(instruction.runtime_address));; - SetOperandValue(context, builder, src, Lvalue, to_string(instruction.runtime_address)); + SetOperandValue(context, builder, src, Lvalue, to_string(instruction.runtime_address));; /* TEMP := SRC + DEST; SRC := DEST; @@ -2484,9 +2502,9 @@ printvalue(result) // TODO: stuff void lift_rdtsc(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledInstruction& instruction) { - auto rdtscCall = builder.CreateIntrinsic(llvm::Intrinsic::readcyclecounter, {}, {}); + auto rdtscCall = builder.CreateIntrinsic(Intrinsic::readcyclecounter, {}, {}); auto edxPart = createLShrFolder(builder,rdtscCall, 32, "to_edx"); - auto eaxPart = createTruncFolder(builder,rdtscCall, llvm::Type::getInt32Ty(context), "to_eax"); + auto eaxPart = createTruncFolder(builder,rdtscCall, Type::getInt32Ty(context), "to_eax"); SetRegisterValue(context, builder, ZYDIS_REGISTER_EDX, edxPart); SetRegisterValue(context, builder, ZYDIS_REGISTER_EAX, eaxPart); @@ -2622,7 +2640,7 @@ namespace flagOperation { Value* resultValue = createZExtFolder(builder,builder.CreateNot(pf), Type::getInt8Ty(context)); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); } @@ -2764,17 +2782,17 @@ namespace flagOperation { auto Lvalue = GetOperandValue(context, builder, dest, dest.size); auto bitIndexValue = GetOperandValue(context, builder, bitIndex, dest.size); - unsigned LvalueBitW = llvm::cast(Lvalue->getType())->getBitWidth(); - auto Rvalue = builder.CreateAnd(bitIndexValue, llvm::ConstantInt::get(bitIndexValue->getType(), LvalueBitW - 1)); - auto shl = builder.CreateShl(llvm::ConstantInt::get(bitIndexValue->getType(), 1), Rvalue); - auto andd = builder.CreateAnd(shl, bitIndexValue); - auto icmp = createICMPFolder(builder, CmpInst::ICMP_NE, andd, llvm::ConstantInt::get(andd->getType(), 0)); + unsigned LvalueBitW = cast(Lvalue->getType())->getBitWidth(); + auto Rvalue = createAndFolder(builder,bitIndexValue, ConstantInt::get(bitIndexValue->getType(), LvalueBitW - 1)); + auto shl = createShlFolder(builder,ConstantInt::get(bitIndexValue->getType(), 1), Rvalue); + auto andd = createAndFolder(builder,shl, bitIndexValue); + auto icmp = createICMPFolder(builder, CmpInst::ICMP_NE, andd, ConstantInt::get(andd->getType(), 0)); setFlag(context,builder,FLAG_CF,icmp); } - + // actually this creates the poison void lift_btr(LLVMContext& context, IRBuilder<>& builder, ZydisDisassembledInstruction& instruction) { auto dest = instruction.operands[0]; @@ -2786,29 +2804,36 @@ namespace flagOperation { auto bitIndexValue = GetOperandValue(context, builder, bitIndex, bitIndex.size); - auto adjustedBitIndexValue = builder.CreateURem(bitIndexValue, ConstantInt::get(bitIndexValue->getType(), Lvalue->getType()->getIntegerBitWidth()), "btr-urem"); - - adjustedBitIndexValue = createZExtOrTruncFolder(builder,adjustedBitIndexValue, Lvalue->getType(), "castedBitIndex"); + bitIndexValue = createZExtOrTruncFolder(builder, bitIndexValue, Lvalue->getType(), "castedBitIndex"); - unsigned LvalueBitW = llvm::cast(Lvalue->getType())->getBitWidth(); - auto Rvalue = builder.CreateAnd(bitIndexValue, llvm::ConstantInt::get(bitIndexValue->getType(), LvalueBitW - 1)); - auto shl = builder.CreateShl(llvm::ConstantInt::get(bitIndexValue->getType(), 1), Rvalue); - auto andd = builder.CreateAnd(shl, bitIndexValue); - auto icmp = createICMPFolder(builder, CmpInst::ICMP_NE, andd, llvm::ConstantInt::get(andd->getType(), 0)); + unsigned LvalueBitW = cast(Lvalue->getType())->getBitWidth(); + + auto Rvalue = createAndFolder(builder,bitIndexValue, ConstantInt::get(bitIndexValue->getType(), LvalueBitW - 1)); + auto shl = createShlFolder(builder,ConstantInt::get(bitIndexValue->getType(), 1), Rvalue); + auto andd = createAndFolder(builder,shl, bitIndexValue); + auto icmp = createICMPFolder(builder, CmpInst::ICMP_NE, andd, ConstantInt::get(andd->getType(), 0)); setFlag(context, builder, FLAG_CF, icmp); - auto mask = createShlFolder(builder,ConstantInt::get(Lvalue->getType(), 1), adjustedBitIndexValue, "btr-mask"); + auto mask = createShlFolder(builder,ConstantInt::get(Lvalue->getType(), 1), bitIndexValue, "btr-mask"); mask = builder.CreateNot(mask, "btr-not"); auto resultValue = createAndFolder(builder,Lvalue, mask, "btr-clear-" + to_string(instruction.runtime_address) + "-"); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); + printvalue(Lvalue) + printvalue(bitIndexValue) + printvalue(Rvalue) + printvalue(shl) + printvalue(andd) + printvalue(icmp) + printvalue(mask) + printvalue(resultValue) } @@ -2920,7 +2945,7 @@ namespace flagOperation { auto resultValue = createXorFolder(builder,Lvalue, mask, "btc-xor"); - SetOperandValue(context, builder, dest, resultValue); + SetOperandValue(context, builder, dest, resultValue, to_string(instruction.runtime_address)); setFlag(context, builder, FLAG_CF, isBitSet); } diff --git a/lifter/includes.h b/lifter/includes.h index 7e8e286..86c479e 100644 --- a/lifter/includes.h +++ b/lifter/includes.h @@ -6,7 +6,7 @@ #define ZYDIS_STATIC_BUILD #endif // ZYDIS_STATIC_BUILD #ifndef NDEBUG -#undef NDEBUG +#define NDEBUG #endif //#define _DEVELOPMENT diff --git a/lifter/lifter.cpp b/lifter/lifter.cpp index 4840411..ca64594 100644 --- a/lifter/lifter.cpp +++ b/lifter/lifter.cpp @@ -247,5 +247,5 @@ int main(int argc, char* argv[]) auto elapsed = std::chrono::high_resolution_clock::now() - start; long long microseconds = std::chrono::duration_cast( elapsed).count(); - cout << "\n" << dec << microseconds << " microsecond has past"; + cout << "\n" << dec << microseconds << " microsecond has past" << endl; }