From 4812436776b2424dbe7df8e2f4b6e54271d032de Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 24 Apr 2023 11:17:46 -0700 Subject: [PATCH 1/7] update readme --- bin/readme.md | 42 ++++++++++++++++++++++++++++++++++++++++++ readme.md | 10 ++++++---- 2 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 bin/readme.md diff --git a/bin/readme.md b/bin/readme.md new file mode 100644 index 00000000..30cb7358 --- /dev/null +++ b/bin/readme.md @@ -0,0 +1,42 @@ +# Windows Override + +Dynamically overriding mimalloc on Windows is robust and has the +particular advantage to be able to redirect all malloc/free calls that go through +the (dynamic) C runtime allocator, including those from other DLL's or libraries. +As it intercepts all allocation calls on a low level, it can be used reliably +on large programs that include other 3rd party components. +There are four requirements to make the overriding work robustly: + +1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch). + +2. Link your program explicitly with `mimalloc-override.dll` library. + To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some + call to the mimalloc API in the `main` function, like `mi_version()` + (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project + for an example on how to use this. + +3. The `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put + in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL). + The redirection DLL ensures that all calls to the C runtime malloc API get redirected to + mimalloc functions (which reside in `mimalloc-override.dll`). + +4. Ensure the `mimalloc-override.dll` comes as early as possible in the import + list of the final executable (so it can intercept all potential allocations). + +For best performance on Windows with C++, it +is also recommended to also override the `new`/`delete` operations (by including +[`mimalloc-new-delete.h`](https://github.com/microsoft/mimalloc/blob/master/include/mimalloc-new-delete.h) a single(!) source file in your project). + +The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic +overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected. + +# Minject + +We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always +ensure the the DLL comes first in the import table of the final executable. +We can in many cases though patch existing executables without any recompilation +if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll` +into the import table (and put `mimalloc-redirect.dll` in the same folder) +Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388)). + +The `minject` program can also do this from the command line, use `minject --help` for options. diff --git a/readme.md b/readme.md index ecab8131..7fae9702 100644 --- a/readme.md +++ b/readme.md @@ -29,6 +29,8 @@ It also includes a robust way to override the default allocator in [Windows](#ov bounded worst-case times with reference counting). Partly due to its simplicity, mimalloc has been ported to many systems (Windows, macOS, Linux, WASM, various BSD's, Haiku, MUSL, etc) and has excellent support for dynamic overriding. + At the same time, it is an industrial strength allocator that runs (very) large scale + distributed services on thousands of machines with excellent worst case latencies. - __free list sharding__: instead of one big free list (per size class) we have many smaller lists per "mimalloc page" which reduces fragmentation and increases locality -- @@ -439,7 +441,7 @@ This is provided by [`mimalloc-override.h`](https://github.com/microsoft/mimallo under your control or otherwise mixing of pointers from different heaps may occur! -## Tools +# Tools Generally, we recommend using the standard allocator with memory tracking tools, but mimalloc can also be build to support the [address sanitizer][asan] or the excellent [Valgrind] tool. @@ -447,7 +449,7 @@ Moreover, it can be build to support Windows event tracing ([ETW]). This has a small performance overhead but does allow detecting memory leaks and byte-precise buffer overflows directly on final executables. See also the `test/test-wrong.c` file to test with various tools. -### Valgrind +## Valgrind To build with [valgrind] support, use the `MI_TRACK_VALGRIND=ON` cmake option: @@ -481,7 +483,7 @@ Valgrind support is in its initial development -- please report any issues. [Valgrind]: https://valgrind.org/ [valgrind-soname]: https://valgrind.org/docs/manual/manual-core.html#opt.soname-synonyms -### ASAN +## ASAN To build with the address sanitizer, use the `-DMI_TRACK_ASAN=ON` cmake option: @@ -510,7 +512,7 @@ Adress sanitizer support is in its initial development -- please report any issu [asan]: https://github.com/google/sanitizers/wiki/AddressSanitizer -### ETW +## ETW Event tracing for Windows ([ETW]) provides a high performance way to capture all allocations though mimalloc and analyze them later. To build with ETW support, use the `-DMI_TRACK_ETW=ON` cmake option. From 40f99ce285ef2add22f06a6cb0248a4e163031f4 Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 24 Apr 2023 11:26:13 -0700 Subject: [PATCH 2/7] update readme --- bin/readme.md | 2 +- readme.md | 44 ++++++++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/bin/readme.md b/bin/readme.md index 30cb7358..23b94e81 100644 --- a/bin/readme.md +++ b/bin/readme.md @@ -37,6 +37,6 @@ ensure the the DLL comes first in the import table of the final executable. We can in many cases though patch existing executables without any recompilation if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll` into the import table (and put `mimalloc-redirect.dll` in the same folder) -Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388)). +Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388). The `minject` program can also do this from the command line, use `minject --help` for options. diff --git a/readme.md b/readme.md index 7fae9702..f50a0e8e 100644 --- a/readme.md +++ b/readme.md @@ -394,32 +394,44 @@ the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-i ### Dynamic Override on Windows -Overriding on Windows is robust and has the -particular advantage to be able to redirect all malloc/free calls that go through +Dynamically overriding on mimalloc on Windows +is robust and has the particular advantage to be able to redirect all malloc/free calls that go through the (dynamic) C runtime allocator, including those from other DLL's or libraries. +As it intercepts all allocation calls on a low level, it can be used reliably +on large programs that include other 3rd party components. +There are four requirements to make the overriding work robustly: -The overriding on Windows requires that you link your program explicitly with -the mimalloc DLL and use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch). -Also, the `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put -in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency). -The redirection DLL ensures that all calls to the C runtime malloc API get redirected to -mimalloc (in `mimalloc-override.dll`). +1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch). -To ensure the mimalloc DLL is loaded at run-time it is easiest to insert some -call to the mimalloc API in the `main` function, like `mi_version()` -(or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project -for an example on how to use this. For best performance on Windows with C++, it +2. Link your program explicitly with `mimalloc-override.dll` library. + To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some + call to the mimalloc API in the `main` function, like `mi_version()` + (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project + for an example on how to use this. + +3. The `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put + in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL). + The redirection DLL ensures that all calls to the C runtime malloc API get redirected to + mimalloc functions (which reside in `mimalloc-override.dll`). + +4. Ensure the `mimalloc-override.dll` comes as early as possible in the import + list of the final executable (so it can intercept all potential allocations). + +For best performance on Windows with C++, it is also recommended to also override the `new`/`delete` operations (by including -[`mimalloc-new-delete.h`](https://github.com/microsoft/mimalloc/blob/master/include/mimalloc-new-delete.h) a single(!) source file in your project). +[`mimalloc-new-delete.h`](https://github.com/microsoft/mimalloc/blob/master/include/mimalloc-new-delete.h) +a single(!) source file in your project). The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected. -(Note: in principle, it is possible to even patch existing executables without any recompilation +We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always +ensure the the DLL comes first in the import table of the final executable. +In many cases though we can patch existing executables without any recompilation if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll` into the import table (and put `mimalloc-redirect.dll` in the same folder) -Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388)). - +Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388) or +the [`minject`](bin) program. ## Static override From eef8ca1041f2d90fa8361108a8c49b122714f743 Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 24 Apr 2023 11:29:05 -0700 Subject: [PATCH 3/7] update readme --- readme.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/readme.md b/readme.md index f50a0e8e..6f908ab9 100644 --- a/readme.md +++ b/readme.md @@ -402,18 +402,15 @@ on large programs that include other 3rd party components. There are four requirements to make the overriding work robustly: 1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch). - 2. Link your program explicitly with `mimalloc-override.dll` library. To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some call to the mimalloc API in the `main` function, like `mi_version()` (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project for an example on how to use this. - 3. The `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL). The redirection DLL ensures that all calls to the C runtime malloc API get redirected to mimalloc functions (which reside in `mimalloc-override.dll`). - 4. Ensure the `mimalloc-override.dll` comes as early as possible in the import list of the final executable (so it can intercept all potential allocations). From 698158075b965214d37da55ca7e9cd77ef6ee515 Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 24 Apr 2023 11:31:11 -0700 Subject: [PATCH 4/7] update readme --- bin/readme.md | 16 +++++++++------- readme.md | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/bin/readme.md b/bin/readme.md index 23b94e81..c7ec0814 100644 --- a/bin/readme.md +++ b/bin/readme.md @@ -1,7 +1,7 @@ # Windows Override -Dynamically overriding mimalloc on Windows is robust and has the -particular advantage to be able to redirect all malloc/free calls that go through +Dynamically overriding on mimalloc on Windows +is robust and has the particular advantage to be able to redirect all malloc/free calls that go through the (dynamic) C runtime allocator, including those from other DLL's or libraries. As it intercepts all allocation calls on a low level, it can be used reliably on large programs that include other 3rd party components. @@ -15,7 +15,7 @@ There are four requirements to make the overriding work robustly: (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project for an example on how to use this. -3. The `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put +3. The [`mimalloc-redirect.dll`](bin) (or `mimalloc-redirect32.dll`) must be put in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL). The redirection DLL ensures that all calls to the C runtime malloc API get redirected to mimalloc functions (which reside in `mimalloc-override.dll`). @@ -25,18 +25,20 @@ There are four requirements to make the overriding work robustly: For best performance on Windows with C++, it is also recommended to also override the `new`/`delete` operations (by including -[`mimalloc-new-delete.h`](https://github.com/microsoft/mimalloc/blob/master/include/mimalloc-new-delete.h) a single(!) source file in your project). +[`mimalloc-new-delete.h`](include/mimalloc-new-delete.h) +a single(!) source file in your project). The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected. -# Minject +## Minject We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always ensure the the DLL comes first in the import table of the final executable. -We can in many cases though patch existing executables without any recompilation +In many cases though we can patch existing executables without any recompilation if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll` into the import table (and put `mimalloc-redirect.dll` in the same folder) -Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388). +Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388) or +the [`minject`](bin) program. The `minject` program can also do this from the command line, use `minject --help` for options. diff --git a/readme.md b/readme.md index 6f908ab9..f545fb9e 100644 --- a/readme.md +++ b/readme.md @@ -407,7 +407,7 @@ There are four requirements to make the overriding work robustly: call to the mimalloc API in the `main` function, like `mi_version()` (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project for an example on how to use this. -3. The `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put +3. The [`mimalloc-redirect.dll`](bin) (or `mimalloc-redirect32.dll`) must be put in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL). The redirection DLL ensures that all calls to the C runtime malloc API get redirected to mimalloc functions (which reside in `mimalloc-override.dll`). From f181afbc57c420e8d87f0d55798db6f70dbe093e Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 24 Apr 2023 11:32:05 -0700 Subject: [PATCH 5/7] update readme --- bin/readme.md | 4 ++-- readme.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/readme.md b/bin/readme.md index c7ec0814..f7c9ba03 100644 --- a/bin/readme.md +++ b/bin/readme.md @@ -15,7 +15,7 @@ There are four requirements to make the overriding work robustly: (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project for an example on how to use this. -3. The [`mimalloc-redirect.dll`](bin) (or `mimalloc-redirect32.dll`) must be put +3. The [`mimalloc-redirect.dll`](../bin) (or `mimalloc-redirect32.dll`) must be put in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL). The redirection DLL ensures that all calls to the C runtime malloc API get redirected to mimalloc functions (which reside in `mimalloc-override.dll`). @@ -25,7 +25,7 @@ There are four requirements to make the overriding work robustly: For best performance on Windows with C++, it is also recommended to also override the `new`/`delete` operations (by including -[`mimalloc-new-delete.h`](include/mimalloc-new-delete.h) +[`mimalloc-new-delete.h`](../include/mimalloc-new-delete.h) a single(!) source file in your project). The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic diff --git a/readme.md b/readme.md index f545fb9e..2772bcb7 100644 --- a/readme.md +++ b/readme.md @@ -416,7 +416,7 @@ There are four requirements to make the overriding work robustly: For best performance on Windows with C++, it is also recommended to also override the `new`/`delete` operations (by including -[`mimalloc-new-delete.h`](https://github.com/microsoft/mimalloc/blob/master/include/mimalloc-new-delete.h) +[`mimalloc-new-delete.h`](include/mimalloc-new-delete.h) a single(!) source file in your project). The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic From 53433225d3c506b883156230e6f12b2af4296c3b Mon Sep 17 00:00:00 2001 From: Daan Date: Mon, 24 Apr 2023 11:33:12 -0700 Subject: [PATCH 6/7] update readme --- bin/readme.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bin/readme.md b/bin/readme.md index f7c9ba03..e08302ad 100644 --- a/bin/readme.md +++ b/bin/readme.md @@ -15,7 +15,7 @@ There are four requirements to make the overriding work robustly: (or use the `/INCLUDE:mi_version` switch on the linker). See the `mimalloc-override-test` project for an example on how to use this. -3. The [`mimalloc-redirect.dll`](../bin) (or `mimalloc-redirect32.dll`) must be put +3. The `mimalloc-redirect.dll` (or `mimalloc-redirect32.dll`) must be put in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL). The redirection DLL ensures that all calls to the C runtime malloc API get redirected to mimalloc functions (which reside in `mimalloc-override.dll`). @@ -38,7 +38,6 @@ ensure the the DLL comes first in the import table of the final executable. In many cases though we can patch existing executables without any recompilation if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll` into the import table (and put `mimalloc-redirect.dll` in the same folder) -Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388) or -the [`minject`](bin) program. +Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388). The `minject` program can also do this from the command line, use `minject --help` for options. From 2531f5708bffc50eaf15383e676c8ebe8a3d9ac5 Mon Sep 17 00:00:00 2001 From: daanx Date: Mon, 24 Apr 2023 22:30:36 -0700 Subject: [PATCH 7/7] update minject; possible fix for issue #734 --- bin/minject.exe | Bin 20992 -> 22016 bytes bin/minject32.exe | Bin 18432 -> 18944 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/minject.exe b/bin/minject.exe index 625816f1f7774c1f57b70033ea4fbb5e7a14e270..dba8f80fd2a0ef8b0137d50a8e67996c5b84a9c9 100644 GIT binary patch delta 9828 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 aPEr)SnH#sKZqL}BwLO2kxNCe-7x&*gI6M6S delta 8628 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 diff --git a/bin/minject32.exe b/bin/minject32.exe index 6857ad0ce1ccd014ed02c99d2c13feb5783fddb9..f837383b988362becd9b279b5ac254b7072d5777 100644 GIT binary patch delta 6793 zcmd^Ee_T^Xwx1gk2=XJ*LJNo*G$>ZUgd{)+`GF8c7c7bbwxFVfULvAGVzo+>HqaU` zSn73sZP)d+t6TS@cB`ek57%8A#3HtC>uR6c)ot0XZLh_(?21aaZu7o#!ItiOpU?Ze zzu&dz%$e^wbLPyMGjqeOw}bKSVmfjqgn7X-hn=uJ_3N^MIS2343jPlVE6~6GZ~2Fo zitW5ZcCnp%=uxrFJ5-K#jyM0%60~Il`3I+<-LZRti0|0_yMt7}W4BH0FRok7Qr|Bm z#XVeNC!~mx5m(K;8Z!Fy6A2T+L{B4X0Mkc6NeZ99lrcs824-4#n}m?Kg@mksA!%Z4 zMKK|^(UD?bNEE8EJb`H7*Ez>T5Pz^g({p1-|K7(!}0ycXh0o=f>;kv|}E`CQ*u zQukj5B79$k421f=k_<49aCW)w3P=3*d#wSNi(4AmovgZHRIdzY()6{ zUNFddsdV)oF9{n86XidD!~Zj^l&R+z$rm68d*nIMsj%^#l5)e&^k8f%e@#9MYGwGW z_~AJ=!hP&#UbzQhTb{I(CHZjo$A9ok!e3$<`J3VMr+f&NF!*&a$SocAoswVA3I>Bt zDNBcz1!Glw*|;Yp`x5vM#!Zs6B=9%K86?FCoyid`%mgL%m3}uETvWnVP!R(03}*bXQ^jg!|_DGlY;^-S^6z4Aj>|L}}_(v`QI5fCpnE`T2^cJ^C6OK?x1J z!@Xt$m0dQj`Cd6&K;!t;Et&_p7;Pd~H5}A;ma#0=`~;f0Vu~8SNR9b(FZ%{t> z;OMHjLBC6#7<8$X<=E&rK4QFz*~F)gSFdbC47YyHz32OLh}WE1gSFh+e_|^@MZsWu zfm-FXIY|i}EPOfvTUV)00a}kml#~WzE5zvJtpRs!c7a;qvS!P&;KE%|TE=$3hj8<6 z{E_hqRypF`UZ76Ju-s*?O2hc^e^Zu~vRA2Q3p8iHf0lAL zp1z?($@-e*Olg^7?@3*tTz6&L(%{v-HX@MSn zd*rcf{^t+qLqC%cax9ns{2MVDp@$L6v8}L8^|-b=C2R|f%7PbA zMku+6_JtCE@!<6~7&*h)ZDVy4yibLj6|D;qN&CWa{^Fs5I%gPr_FqiGU}6wWLc_iTeMWW>Tght%6 zE0*g5;(fqIY_J$vPvJ`3TW1`PY zXMgeCNMQkn_)e)>uegj}Q<`hy$dIi+bb*05W1_0`JJ0#JrbT=pjy>>BQVOg3-s|nZ zipRtIJ25Ur%RX8`<|5nuz?`O%69|p)f0a%1(7SjDozb9i#i=npO#F6v@DexZI~CJ< z$E8(F@lvCpTizQ=Mr^p^A*abN<=W>mc`z=)u8s_dY`x>Y2+Qxx=ru0o1{6-IlNosf z;6COqbN0bjPrxnZdIrLffs0MJEUZ&E6kjmIXx_=R( zsHP&JdU-LVJ741b;iVz8Mi3(CWk{BAkcv|wa)ZMAke!TQBV4YRpt?>)E^i6Any!2* zEC|Dvv1xEoB!&51uo9sd*2|Wm!WRjH6wQMZ{8))#Z$AvfnN%x;0TU#YU8N?+#etQg zst+>U%Y+F2`M7BbD?*`f7WHbX?{UVk%EdM!#PDb1l9SJ2A9ZK)Ox=o>+1Mn^I^Q2f zL3RoDg)IaVcJmL$Cx<)7(XdX-&hZ8DMn=y+6+hWvq?qu}aIA7zNI-|v2vKP8meB~k z!!)arSbrn}MM!H}uDE5w*Zd#ir%&9DG0T?qa1KHE{YbzW-sUd|^e6ZU3Dd*#p%1$I zg$;aO!V=|9|MP@dVV4mlBQ*1u5>h=MK_)Kg5vHoAjC0FTLNedC zjC++3F*0&GYGf*V6;{IAa?Ff%Dp-MbkBoF(voZn$8sC|qKZ;uUqxwaDP2|+jA9X|I zgW$a~Iv;a{SzguSlnJvXk%XLe%2^G~>tcS##OJ4sL)sCs!rLq-?r>e;*oPSL9Kyrp z>@{EJa}#I8(TRd6Tz8njAxYm(`4h6z?=?d(ZHx=1yQg}^ob=}9x> zxwx%*y0UBdBa@OI{26xtv{ZdoLXYNETw8eW3x58KNq#2CZh=_xHcAw^P;Q)ar=6kpC+@FQ>> z_dzgLkJ1cY^7Tqhw;HeGHl?&BpPd+ashvh$X9M`rb4~tFO5Sl&D%Tl1@>||e}*h=@Q z(6-y<`%-CNtl!fz7N!jTy$WS9*{4SLv@8xhTuK6`Wr?C1RWC~!m7LOwH34$kn~J`K z;LaBNTom1Af01k${qBCkMaA(8r={fwY$(9wJtBWadp!3n+zY2SUi=>2-#gh$YIb) z&{fdiL7~8>f?7c9L0f^@(9-8Mv@b6qqyy9lsst?t6@re8+B~zAkWHWj5Pd#{?kwc! z@{#^;B@Tfr~fa#z@kQ1~KbP+lM^fKgMfPM`MfZnAo@cp1(IBr3I0UXzYT%Z`n+fUwrGn^_G0P^l zlr>EMUOt|TYMX9*At`n|Efrcrj>g7yjX5e}>U?R&mtk?Llp05EwY%P>s%uisSho@C zx*ErfnY?edc2-)AW0m`Hm1~`WMlRt6E#Pwz?jlJ<{&mju>@bm_3_ebe$nu zM#9T=CHU}hRD$EO(nbOcM~A%VA8hqI5#GfyiuJ@Sshg zEug1BJ)rkMQY|J29Zx3YGrZNPKWhjo2iPVIU0hmF`r%I=>T`ckx^VyJACb5NrV6^4 z{G7_AO^!zX8+}yRXu9|?!~B`_Q9{#zy>h z8nw%$7+FckIW+gbxt&9Q6Y`tBs;LRTvA1XC@O@b^o&z)RCIrz3@9Q9KFORmge_*DK z{03BrY41O8VLH8ykUe9t4xG7dz=pnYa4?-3TzWFnwR^}i~P~-iT~g4yIKE-`;PzG_@~ZKb5?~+d_=m) z?P%Ow;%Ka0*SNO2VYMTFog2R|8p%X{g(dc(DUx{(SH8Qk(b3>q!ZtdpYv$wV+~7G& z{H)rL`3-fhy6XD6Cmp3lbxp29sL3-S^P39jW%szFv82(_gn{HJ|AA$qY=f-S;o{F( z;u$|5Zk;%D3-w*RuEt&OD6DR%sdu0(62{C|(ztH51J&EX7hAXNw8eN9er`K{H2&=Z z9CMQW`sNLZWX5Dp$_&ezoRyrlBWts<)tHoH%DJ2qX_{#&Fs(IhHElP&XgX|q+w^yn zG&e5y<=oeD-^@Lm`{&%@T&X$Q9B-axPBUkje`bEi{73UQW|bw)Vz5+M)>}4P{Faw3 zZ&;37&RH&5u317n)Cs53TI&IG-WasdV`|ziy}QC%XN*Ze73bpSoCm zvOY^+p>NZ_uK!p+q>nRL4NDBq8D22#F&r=)HF$0r5;J|7zs&5(?92Rp=FQAonItPG zt2(tfkgUD`(wh{i*ek^)2f~>z}MQtaq$LgI^p-NH{Vv zNu$C$v-dNpS?7d8EwK@HI= zwei~N+Ei_ZHd|}a7HAh}SC(kYw3XUbT2|Yjb!nf}dbQ7L+mP57wR^SuwFk9Fw7=H= zR(n$0r#-Kon^BZO-)z_sqSxBAMcNXKtJm%_zi58NJZx54pePyre=-><83h@I8J$Ts G7xQ1o)bD2i delta 6126 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 NDa6>lYW7y