From 2cc7fe30b41884a183bf5f8033f1763ef7ad8701 Mon Sep 17 00:00:00 2001 From: byuu Date: Sun, 3 Jun 2007 00:20:00 +0000 Subject: [PATCH] Update to bsnes v020 release. Five months and 43 WIP releases in the making, today I am releasing bsnes v0.020. I'd really like to express my thanks to blargg, for he has written a new S-DSP emulator that is an impressive 32 times more precise than all existing S-DSP emulators. It is now bus-accurate, and should produce bit-perfect sound output to that of a real SNES, excepting very minor, very extreme edge cases. Not only did he do this, he went out of his way to develop a special version exclusively for bsnes to ease licensing concerns and take advantage of bsnes' unique features, notably cothreads. I can't thank him enough. Unfortunately, bsnes has taken a ~10% speed hit over v0.019 by using this new S-DSP emulator, but I must stress the speed hit is entirely due to the way bsnes is implemented. blargg's standalone S-DSP emulator is very, very fast. Anyone is free to take a look at his S-DSP emulator, as he has released it as open source under the LGPL, by visiting his homepage, here. Unfortunately, the new cross-platform UI is not entirely finished. Some sacrifices had to be made to support libui. Specifically, the following features are missing from v0.019, but will hopefully be added back in future releases: - Fullscreen support - Input Configuration panel cannot capture joypad input. Joypad support is still present, but it must be mapped manually through the Advanced panel or through editing bsnes.cfg by hand - The Cheat Code Editor is missing, but cht files can still be used from bsnes v0.019, and created by hand - Sufami Turbo support is not accessible from the UI - The UI on Windows is slightly less polished due to compromises to allow the UI to be readable on Linux. I am sorry for the rough edges listed above, but I wanted to get a new release out, as it has been over five months since the last release, and I really want the world to be able to experience blargg's new S-DSP emulator. Changelog: - Added blargg's new S-DSP emulator, runs at 1.024mhz. Many thanks to blargg for this, as this puts all portions of SNES emulation except for the S-PPU at bus-accuracy - blargg's S-DSP core fixes bugs in both Koushien 2 (J) and Toy Story (U) - Corrected all S-SMP cycle timings to be hardware accurate. Thanks to blargg for creating an amazing test ROM that tested every possible opcode - Corrected S-CPU wai instruction timing, fixes Mortal Kombat II - Reverted HDMA sync emulation once more to fix Breath of Fire II (G) and Secret of Mana (U) - Completely rewrote user interface to use libui, which is a wrapper that allows the same code to produce the same UI on both Windows (through the Win32 API) and Linux (through the GTK+ API) - Corrected $2100.d7 OAM reset behavior, thanks to research from anomie - Massively revamped the Linux port, should compile with no warnings or errors now - Added 64-bit support to libco, tested on FreeBSD/amd64, should work on Linux as well - Revamped makefile with suggestions from Nach - Improved Linux Xv renderer to use the far more common YUY2 format, which should work on most Xorg drivers, allowing hardware accelerated video scaling - Completely rewrote config file system. bsnes.cfg is now saved to user's profile folder on both Windows and Linux, allowing multi-user support - A lot more work has been done behind the scenes, including massive code cleanups and portability improvements You may download the new version on the main bsnes page. --- bsnes.exe | Bin 761856 -> 0 bytes cart.db | Bin 3276 -> 0 bytes license.txt | 35 - readme.txt | 98 -- src/Makefile | 79 +- src/base.h | 24 +- src/bsnes.lnk | Bin 1267 -> 587 bytes src/bsnes_lui.cfg | 181 --- src/cart/cart.cpp | 4 +- src/cc.bat | 2 +- src/cc.sh | 2 +- src/cheat/cheat.cpp | 2 +- src/chip/sdd1/sdd1emu.h | 1 + src/clean.bat | 2 +- src/clean.sh | 2 +- src/config/config.cpp | 110 +- src/config/config.h | 38 +- src/cpu/cpuregs.h | 2 +- src/cpu/scpu/core/core.cpp | 50 +- src/cpu/scpu/core/core.h | 4 +- src/cpu/scpu/core/op.h | 256 ++++ src/cpu/scpu/core/op_misc.b | 10 +- src/cpu/scpu/core/op_misc.cpp | 247 ++-- src/cpu/scpu/core/op_pc.cpp | 123 +- src/cpu/scpu/core/op_read.cpp | 882 ++++++------ src/cpu/scpu/core/op_rmw.cpp | 190 ++- src/cpu/scpu/core/op_write.cpp | 168 +-- src/cpu/scpu/core/optable.cpp | 256 ++++ src/cpu/scpu/core/scpugen.cpp | 10 +- src/cpu/scpu/scpu.cpp | 8 +- src/cpu/scpu/timing/timing.cpp | 2 +- src/dsp/adsp/adsp.cpp | 586 ++++++++ src/dsp/adsp/adsp.h | 172 +++ .../bdsp_tables.cpp => adsp/adsp_tables.cpp} | 4 +- src/dsp/bdsp/bdsp.cpp | 1182 +++++++++-------- src/dsp/bdsp/bdsp.h | 324 +++-- src/dsp/bdsp_official/bdsp.cpp | 32 + src/dsp/bdsp_official/bdsp.h | 10 + src/dsp/bdsp_official/readme.txt | 64 + src/dsp/bdsp_official/spc_dsp.cpp | 828 ++++++++++++ src/dsp/bdsp_official/spc_dsp.h | 162 +++ src/dsp/bdsp_official/spc_dsp_timing.h | 46 + src/dsp/bdsp_official/spc_endian.h | 43 + src/dsp/dsp.h | 6 +- src/interface.h | 1 + src/lib/libbase.h | 347 ++--- src/lib/libco_win32.cpp | 73 - src/lib/libco_win32.h | 18 - src/lib/libco_x86.asm | 124 +- src/lib/libco_x86.h | 22 +- src/lib/libco_x86_64.asm | 88 +- src/lib/libco_x86_64.h | 16 +- src/lib/libconfig.cpp | 215 --- src/lib/libconfig.h | 242 ++-- src/lib/libfile.h | 455 +++++++ src/lib/libinterp.h | 73 + src/lib/libkeymap.h | 425 +++--- src/lib/libstring.cpp | 30 +- src/lib/libstring.h | 23 +- src/lib/libstring_array.cpp | 11 + src/lib/libstring_sprintf.cpp | 21 +- src/lib/libtuple.h | 82 -- src/lib/libui_gtk.cpp | 255 ++++ src/lib/libui_gtk.h | 89 +- src/lib/libui_gtk_control.cpp | 519 ++++---- src/lib/libui_gtk_control.h | 237 +++- src/lib/libui_gtk_window.cpp | 68 +- src/lib/libui_win.cpp | 173 ++- src/lib/libui_win.h | 106 +- src/lib/libui_win_control.cpp | 617 +++++---- src/lib/libui_win_control.h | 247 +++- src/lib/libui_win_window.cpp | 195 ++- src/lib/opgen_s.cpp | 1 + src/lib/opgen_so.cpp | 14 +- src/memory/bmemory/bmemory.cpp | 2 +- src/ppu/bppu/bppu.cpp | 7 +- src/ppu/bppu/bppu.h | 10 +- src/ppu/bppu/bppu_mmio.cpp | 3 +- src/ppu/ppu.cpp | 2 +- src/smp/smpregs.h | 2 +- src/smp/ssmp/core/core.cpp | 24 +- src/smp/ssmp/core/core.h | 6 +- src/smp/ssmp/core/op.h | 256 ++++ src/smp/ssmp/core/op_misc.b | 12 - src/smp/ssmp/core/op_misc.cpp | 224 ++-- src/smp/ssmp/core/op_mov.b | 15 +- src/smp/ssmp/core/op_mov.cpp | 232 ++-- src/smp/ssmp/core/op_pc.b | 21 +- src/smp/ssmp/core/op_pc.cpp | 371 +++--- src/smp/ssmp/core/op_read.b | 18 +- src/smp/ssmp/core/op_read.cpp | 487 +++---- src/smp/ssmp/core/op_rmw.b | 29 +- src/smp/ssmp/core/op_rmw.cpp | 194 ++- src/smp/ssmp/core/opfn.cpp | 14 - src/smp/ssmp/core/optable.cpp | 256 ++++ src/smp/ssmp/core/ssmpgen.cpp | 10 +- src/smp/ssmp/memory/memory.cpp | 44 +- src/smp/ssmp/ssmp.cpp | 12 +- src/smp/ssmp/ssmp.h | 3 + src/smp/ssmp/timing/timing.cpp | 28 +- src/smp/ssmp/timing/timing.h | 1 + src/snes/audio/audio.cpp | 4 +- src/snes/interface/interface.h | 6 +- src/snes/scheduler/scheduler.cpp | 28 +- src/snes/scheduler/scheduler.h | 40 +- src/snes/snes.cpp | 2 + src/snes/tracer/tracer.cpp | 4 +- src/snes/video/filter_ntsc.cpp | 4 +- src/snes/video/video.cpp | 23 +- src/snes/video/video.h | 4 +- src/ui/audio/ao.cpp | 28 +- src/ui/audio/ao.h | 12 +- src/ui/audio/audio.cpp | 116 +- src/ui/audio/audio.h | 14 +- src/ui/audio/dsound.cpp | 70 +- src/ui/audio/dsound.h | 8 +- src/ui/config.cpp | 195 ++- src/ui/input/dinput.cpp | 175 ++- src/ui/input/dinput.h | 25 +- src/ui/input/dinput_keymap.cpp | 127 -- src/ui/input/input.cpp | 297 ----- src/ui/input/input.h | 45 +- src/ui/input/inputui.cpp | 1 + src/ui/input/inputui.h | 26 + src/ui/input/sdl.cpp | 37 - src/ui/input/sdl.h | 13 - src/ui/input/sdl_keymap.cpp | 37 - src/ui/inputmgr.cpp | 115 ++ src/ui/interface.cpp | 33 +- src/ui/lui/event.cpp | 62 +- src/ui/lui/event.h | 8 +- src/ui/lui/main.cpp | 50 +- src/ui/lui/settings/ui_advanced.cpp | 75 ++ src/ui/lui/settings/ui_advanced.h | 11 + src/ui/lui/settings/ui_cheateditor.cpp | 26 + src/ui/lui/settings/ui_cheateditor.h | 10 + src/ui/lui/settings/ui_inputconfig.cpp | 174 +++ src/ui/lui/settings/ui_inputconfig.h | 25 + src/ui/lui/settings/ui_rastersettings.cpp | 115 ++ src/ui/lui/settings/ui_rastersettings.h | 20 + src/ui/lui/settings/ui_settings.cpp | 47 +- src/ui/lui/settings/ui_settings.h | 6 +- src/ui/lui/ui.cpp | 53 +- src/ui/lui/ui.h | 5 + src/ui/lui/ui_about.cpp | 30 +- src/ui/lui/ui_about.h | 4 +- src/ui/lui/ui_main.cpp | 282 +++- src/ui/lui/ui_main.h | 59 +- src/ui/main.cpp | 1 + src/ui/main.h | 1 + src/ui/video/d3d.cpp | 289 +--- src/ui/video/d3d.h | 19 +- src/ui/video/ddraw.cpp | 226 ++-- src/ui/video/ddraw.h | 17 +- src/ui/video/gdi.cpp | 57 + src/ui/video/gdi.h | 24 + src/ui/video/gtk.cpp | 42 +- src/ui/video/gtk.h | 8 +- src/ui/video/sdl.cpp | 42 - src/ui/video/sdl.h | 21 - src/ui/video/video.cpp | 128 -- src/ui/video/video.h | 79 +- src/ui/video/xv.cpp | 228 ++-- src/ui/video/xv.h | 76 +- src/ui/win/bsnes.cpp | 2 - src/ui/win/event.cpp | 44 +- src/ui/win/event.h | 2 +- src/{lib => ui/win/libwin32}/libwin32.cpp | 0 src/{lib => ui/win/libwin32}/libwin32.h | 0 .../win/libwin32}/libwin32_button.cpp | 0 .../win/libwin32}/libwin32_checkbox.cpp | 0 .../win/libwin32}/libwin32_combobox.cpp | 0 .../win/libwin32}/libwin32_control.cpp | 0 .../win/libwin32}/libwin32_control.h | 0 .../win/libwin32}/libwin32_editbox.cpp | 0 .../win/libwin32}/libwin32_file.cpp | 0 .../win/libwin32}/libwin32_groupbox.cpp | 0 .../win/libwin32}/libwin32_label.cpp | 0 .../win/libwin32}/libwin32_listbox.cpp | 0 .../win/libwin32}/libwin32_listview.cpp | 0 .../win/libwin32}/libwin32_misc.cpp | 0 .../win/libwin32}/libwin32_radiobox.cpp | 0 .../win/libwin32}/libwin32_slider.cpp | 0 .../win/libwin32}/libwin32_window.cpp | 0 .../win/libwin32}/libwin32_window.h | 0 src/ui/win/main.cpp | 4 - src/ui/win/settings/ui_rastersettings.cpp | 10 - src/ui/win/settings/ui_videosettings.cpp | 62 +- src/ui/win/settings/ui_videosettings.h | 2 - src/ui/win/ui.cpp | 34 +- src/ui/win/ui_main.cpp | 19 +- 191 files changed, 10418 insertions(+), 6887 deletions(-) delete mode 100644 bsnes.exe delete mode 100644 cart.db delete mode 100644 license.txt delete mode 100644 readme.txt delete mode 100644 src/bsnes_lui.cfg create mode 100644 src/cpu/scpu/core/op.h create mode 100644 src/cpu/scpu/core/optable.cpp create mode 100644 src/dsp/adsp/adsp.cpp create mode 100644 src/dsp/adsp/adsp.h rename src/dsp/{bdsp/bdsp_tables.cpp => adsp/adsp_tables.cpp} (96%) create mode 100644 src/dsp/bdsp_official/bdsp.cpp create mode 100644 src/dsp/bdsp_official/bdsp.h create mode 100644 src/dsp/bdsp_official/readme.txt create mode 100644 src/dsp/bdsp_official/spc_dsp.cpp create mode 100644 src/dsp/bdsp_official/spc_dsp.h create mode 100644 src/dsp/bdsp_official/spc_dsp_timing.h create mode 100644 src/dsp/bdsp_official/spc_endian.h delete mode 100644 src/lib/libco_win32.cpp delete mode 100644 src/lib/libco_win32.h delete mode 100644 src/lib/libconfig.cpp create mode 100644 src/lib/libfile.h create mode 100644 src/lib/libinterp.h create mode 100644 src/lib/libstring_array.cpp delete mode 100644 src/lib/libtuple.h create mode 100644 src/smp/ssmp/core/op.h create mode 100644 src/smp/ssmp/core/optable.cpp delete mode 100644 src/ui/input/dinput_keymap.cpp create mode 100644 src/ui/input/inputui.cpp create mode 100644 src/ui/input/inputui.h delete mode 100644 src/ui/input/sdl.cpp delete mode 100644 src/ui/input/sdl.h delete mode 100644 src/ui/input/sdl_keymap.cpp create mode 100644 src/ui/inputmgr.cpp create mode 100644 src/ui/lui/settings/ui_advanced.cpp create mode 100644 src/ui/lui/settings/ui_advanced.h create mode 100644 src/ui/lui/settings/ui_cheateditor.cpp create mode 100644 src/ui/lui/settings/ui_cheateditor.h create mode 100644 src/ui/lui/settings/ui_inputconfig.cpp create mode 100644 src/ui/lui/settings/ui_inputconfig.h create mode 100644 src/ui/lui/settings/ui_rastersettings.cpp create mode 100644 src/ui/lui/settings/ui_rastersettings.h create mode 100644 src/ui/video/gdi.cpp create mode 100644 src/ui/video/gdi.h delete mode 100644 src/ui/video/sdl.cpp delete mode 100644 src/ui/video/sdl.h rename src/{lib => ui/win/libwin32}/libwin32.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32.h (100%) rename src/{lib => ui/win/libwin32}/libwin32_button.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_checkbox.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_combobox.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_control.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_control.h (100%) rename src/{lib => ui/win/libwin32}/libwin32_editbox.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_file.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_groupbox.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_label.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_listbox.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_listview.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_misc.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_radiobox.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_slider.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_window.cpp (100%) rename src/{lib => ui/win/libwin32}/libwin32_window.h (100%) diff --git a/bsnes.exe b/bsnes.exe deleted file mode 100644 index c503c46bd74331d96e577c053ca9f4b4437a8921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761856 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

mrPqH$_`(smqiUt|Kh#QRlaVjg>x(`h z%a|RX)%)mSgA6rAT!@1<)HnFekEG!RY*nYhiat<0i#3Y@h&APpO^3X0_&I4L{)0=S z%`l3}!=gdqST@$bqJIe;buR)V-N1%aX<-+MJ%o0Z%jDb8l2zJy3LxpKAaVd71XQR# zLeplnzYxZPT{D=ie(DmK)i+{RpC5h&MtN8uzI;SJA=N;cSAU%9N@2s1SH+tY$&d-TEWlzsL;c6hGIL#!9y$hvJ?3bDa zdvGjgr(o~vd1u8-K6rub~_J}Dd15;>wO81ZD^phrR0nP!d zg*b)PJ45(}Zp2-SVNcHlT@EqZiDP7(Y=eV*QPPO1sFGj zsc|zphb&>V!FqcTJ152rSSUc&W2Z>;QQ2?a`3U?cf5WogJ!EA6+msVW^?ANkkAGrR z-$Szr?5ER~!?f;bzpXC5{te`QI7TCK7grp7`s3J%J1Is*HdI=eqDPNl$XZ4#j%r`&!RXr_?DWa59*EqYCX!<# z(g7l*kgF(wo)GCw6PaWqvOG=1Ya?<;nv=;kPF8?O+I$52hp=}r%V+52EPeOMLmUZb z>~6|F1YV)4#qT|VLb&7FWauBq+bS_)>`b<}`ss|#)bp2O7p6e zRPA)7O92IM73H1jQb56{>O-V#x*$;YsVa%|AXipdto<;ub{U>>JT-Xc<6#4e9&1bu zCRj92?uo{9{Z+ zEWiqAw{#qz3uQ$^G5w`qSWKsKgzPk8X=0n(sI~%GUUf2Ck5zb(`*2BO4Ly(?Gz8g` zSQF2NoP{DFRybUsiR}dh7CDJE^ax}-qw)?~Lis_#6D!U!@#qoA5@byeFHWqX2Po?c za=9YlhOK}kK@wMj1i{T{bL-c^BM^E7;=?>#AoKu&esOI|urM?DYljgs;RJ!qZr6 zcp$ggLC)lkp=n%cl39_}q!>^oyo?MI9$5*flrU%7ptxAl6|6`P3lNA5N+U{F$cj|i z5Z9WB3`!%eP!wkgV*7QG%_bJ%Y3`(ZWJRR@^V(-dHWBM4)l(v&6nDoJtvoxe$Pa;< zSi_(+Iq6ppa*?DUGAKWh=W)$W!W~tf`}?5%4r4JJwS=9W#!++3M)aC4N%4@{y8S<>rGMCYf+0(-!es+ znNLfUISHz+dv98%=?`NnB%({7o@y|rfV>7-vP7dPs8-l=T90h}L`0NyZ~YN+X9}qn z8{Q2{N`ac-VcVQa_j*%S*+p_E3q}N$m98nMDs1$=NvzWfs$x|pZBpxM+_a@i zm@3G`B((i@i$7S6D0w7h;!ENF1M4K63z}1`H|5kRHDt6!h@-}D8@&o*nu6+B3X?1B zi8X}UXjT%_6jp~bF$uNNtRki ziS|MBp^40rmd9nS>G%K;t66DpFzqc!dkfRvP}*CR_7+LLXt`ZIOjeKh6mHA^7|~KIjrLX=+({wIDq{UD;n_q zI}kc^F#4uvxZ3UZ-}M8QRwz+*dnJ!k`g&f(4BvHfx64)O>I~`+^}N8}sqA^vRp@dp z^Y*-%Tm;LrW%d1mKV0K7u5Wg`Km}KP$-!tJ4vk_Rr@QK{<}{ewUFuluqkY+Fuu2M5 zRj&eHvOU4XdzoW44INdzV$Zp2PDRp2^_)qj*y7LET?4&O0(y?kGIbmWw)& zJ8Vg?R+ytCY-}Y9INkY&zk<2u>rKds_}wZ)J}C{XNd;IUm{)x(ohyV&r5i6!9Vl3iHk5ilH=;95A(9r zfn?dEP8}=`=P@L8bQtYIp`lHj!-i7969ywWJj%?!O+1c_&4Y8o#y{;hCEMBr;oMVf{yA|pUw>=gwSulQ&qjOfd@^S^^c@x4C;vEb1 z#=|B=N{E*$82$EGykx=nCtEDutx#`#$Aly|FGnB8^A4WC9hI(Y@NUI(E1qsVe}iWS zo@enK!?PAR+wr`N=MWmkFh2bwR(k27mL42le#fa_=m=|L(j#uI!nXvJ%jDyiu;?x=UNop9)G|}Xhmj1H!&geY7NFww`(w=?@1g zAr}*3+kr4*Li8pNGNDhW6M7CiRkj=*z^9%sS9qv|=v4{1(+T~Ek6a%~}p--k0dIDIs9Q^{Hsq01zSm7|S}L)FX3eFxeZHtzb5 zLB1F*xb*Tw238)#-%Bz^bjj598Ck2TUcTE&^ku>FI=aFj6|9f5K<#`Y)Cag|li{ z&);vA&bKlXx?K{In{iY^aygE4l`RrUa`c7Fg#MBVnRn+fA$nCp9qEM5&rE0vK8Y(A z?5NwixaYteeJ-8QOMlGB(UbU0UCzbG>V7W9nVL>$8{?!q|0aBzmu{&Xsav-g>8XCJ z^M4~Vp(RYnyv2tJ(W`RweTh>=DKj@Sp)yHGF8Wak$z4B^qg&DmooyymZ>)IRY>iXXC9l7E*$9Yb-jP25ki>8y26U4aq*765;jXa*?|!fjm`3eClUxASOS1Wcdv&nI z6L|ytC|jD-xHbCm_Uo|eGYc`o?OyB(VIq3+5cZnN0HFcjp=5p@$++%hO4>!+plhSl z3Rr5X(!;xiZ6KNd1fr)Z3Yme#}=CbE$IM)^jOFY z;Chl7gCIR-V2z4ta8=3-AV`mGH3PV?Wd;zW$CjD_TpKe32-0J-%m6O0nE?dpv2m=- zF%7QJnE?dpG0edvfQx))06}`J+YI13p&3As9;-3~D$)T2=`pVv!2J|620?o402&Ju z=VGTBK#(3=YX)#b#|$7yk2RVBTx>N12-0IgGl1>S3?N949nMl|a2ePPAV`mGGy}L^ zYz7dd$J)#QuD6>31nF`=pfmFlHXpie0@^5u|P+^cB zYk^B)98L!iq{j-(fV^}7L3->6x-?@PN{<}`{jVE_p7_y(!XHY3(uMz%6v&ba|JTZY zvsp14(iKCH9*dX(i_-xF!Gy^S2&DrE(qqTXvD-+G-2~~e?PdTsf6TF)AU(Fi3|N{D zAn1Rf1~mR~Lit~j0;S9UvJ~j_rNMMo=|AM6ewM2Z~nlA{nCv_@;QV4hwbK%ni&XTUb;=JJo)2n-v?M|n*suXIj#5LVV*Jez^llR^^3sjq_y zl1gGk!ci(N*wfxeqxhe5VM5)%Bb!-r(nuo8K??GvE^jff7%Yl9C-jAcsqvKwGA8$ohwo|jOfh{nvKIgXP zVi>lM=lJh>9Hg*wwBm0nU6FgRkJZ1Ldr*%Z!6}&-4M?%H!5i^-UJ~m)M{x6x!uaXC zV02>(Nns@31*7tJFw>S)ZhjXG8fPes&%X=CQtW~$jE|ijL!ZVJu!lRHndN4G4gvf- zO}^x)P;ykAX;{1TZtNxD*^cKaJmYvSK>4serpV@kYyh>7QvvkdCP}7uOwHsXb*D& z*vXj^-sHs#KjnKZY&5W=JBCxX$f`h*Aql`Tabz{P?-{0QJN6l6&bG^xWb7FwX1~lcBp*&F9$d&I( zQlgKP_y(o(EJBZ3gjzsoQHoMS;$E%=mG9~NNdHTIG=no(L70NO( zz#+PPq|@Ku!42780{7_87$BzZEXo7;f-wYZ*7zLy4g69|rSzMH%l_2vR@wh6g(Dd- z@r4b+cd2Bg|K*b;?Xvhr;}jEe)xKbdMN_$aX#~KKMgR=1GpSaS!jKvThSVr9xOSzQ zK?)-?m9S~<$#z(0JPJ{0rNS1a5&{w%nzXq(v4sW+*F=Rm`_Elt*oGRg3%NTiN&x;Z#eJUSEgB z`GWHtwzrfcfBp#pu^;v0@COZV2iV7L#1$yC8<=g%T>`co0pO?&Bp!zNtW2u^eiV! zv&a&IY&pwhDU+t1B}$Z(T`x;1OqK|=(aO(k&l7*&&1z#Q+0<-I5q{b5$*(dcXg7=S z3*?tUwlv6ZMAhFFxVm${> zaKj)Qp$Xk7)!9^@xHJqx8%T)8@HB%16%m_?3hxWJb`SN#XcvlXtns)OgF9&P0v)+UCxcez^*Z55 ziO^z;ZZd{ohL^T>3!&{N4=NSTrXN6DYyUR@05i@Po5e5h; z8i;?nQfO2aO|vnMu|8#;@9e>!WRGwN0_nkR*f*qAzk_DFJE)G2#%-RJU?2V~WWXj+ zq;$a!-`KI2(rq?w5_VMgcd}DMb{s+=lbuYOX?Dyx2-_EROr@@U4=qg8wc~7_Hg!!@ zti@E6U-7$T<92XRw@8aJN)y=Xk5VzI4IFIdAApkje&xSs~p z#)l6<#S)WhP!N-9P;e^>-?1nNR}>&1(i;Q62|1}yzPn>(Vm*5me9IDYIsm>%Vm)`y z;9Hmw3xD_;6Jo&+-!%!b(1))wAr|=XeLAt8n|<&VC&YptzKeuxXgH2TA+La~h zP(^Zd_M9Uym(%kP!3AnvKRqa3M9oG##t^B&81yhkH?_O`6>ud6J()4MMW{0dJ&aL8 zd#L;(xDtb&%or>$i9ruz?4|CPzYDI!peHj1H!dXxJ;D`cY~V^RZbd%m$&A50P>Deg zV|1X!>-kIIN*eTJ#*mW~%m+P;af%9l{u^*520fWExHBth(8CzpsW0Ylg)1@W$&A5z zml*Ug#;BClzEoM!lNp2i#S()a#;D*7A%7NJNrRru7;@5r`Jjg}Hc08NOO-A?nK9(V z1!K^|7+$WrN8d%+>!KBUWc09*ci=K+oH;AHhKz>D97UiA*K zyWqQMs(N!-nBOI6vp9t=#|I#La7-e=V-mc(z_*h)xa@$WHQ5n|C@a&edOa{e(qf~C zYCMWNTf$16k8HzmQDN0i=U*Nc5P`QU^&7Z#X?A>Z&zrsk6Cl?Vpj9ZDSYG3`cf>k_>|K zwKes%UX5K!IX91_)iEI%xQcN)NKTY06;xrFGL%{;OPxsOa{N!-E$ z6}3{1fToyei)?1*=9ptM*lLSxAS5+f3uLVwvi=YnN2C{^#2R{`owed<<}HznkdCRD zfemg{VI=QhRA3gE36j5iVToloepUw)-W`UyISG8h-;o3y_{J?2{0&y zXj?mE|Li%o0R+?MW$wWj$MYDqAvqpS4+p04XfoNcuzZf3n`y$&fdG!x_d@i5_5jS2 z0yz2pxU%9LLCgR^Dn4v{16qK1dxqIfn~Zh9BTdGz_MlS9F} zusUkQUxC!u3o8(Xn8T?2VG1LqmRQ4F)){~QG=3clSNzwHeeAs%|0)nON@6hpDB+!8 zkp+TtM-TO~jF|%^tthX(avpZepDnc1Z&H}2VxP3mx=Kgm-45y`czSN`=x7_6AS7tI z>#YMMf(0Qg|D=Jdi3Y_m4e7N*RPkj+RuX9Tg5xCNPu$CrRlR^mUG?=_`P~7;#2R{W zdio0VNZb;|nAY)G7J5qM&TIcG^Q<$W?O}B`**wNNZ96Y8SkG>Oi?rHH`1>0%?p0!% z)+X$O?zimsn;r*<{T%DuURaJVUN5g82k3~xc9H5os7 z9J$94$6|2Uj-^kYbHw%Rt3%8+JMiQlc3^&)LK6EuQRK_t%Pt4zy;OKEq%#dyt#p2< z?5>ZVaJ$9=-49-hw`*)t_k$sN{JoU4`duuJhSKK{p{e8Y#J59Kf`5m%cBK<|OuT?rY zyN3jpUy!()^)#I20yjOoC3Oi|cC2TJrDwL7n-8+Z$lY}u@1k=;?rWua>>NZr;6Ud- zyuu0D2*G|Gu;olC3!GadqqrgM=y(5UZCUC0wf|Owb_BhS5!>_dI|v*uWyzA8AhMAX zDZW6Il1)TbqA(Hys68(XlodI8R5n;vq!LxV%}e3;#o?Uh}Dk}{YjJp zmOOLJWra7uRg*|ZQy@{csb63*#nR*Lh5UzN{o;D$b}r1vhv$CEJuf z^Pi@w9*7vs>$#Ga{H_m@6RXR}s3eD8yh+5Lj8WzokV@wf2@W$!VR8F$h8eg%(SA81N!V>2y(s&h{FoVMm36zgKR zIFK1OLN{jPcU}aza|w#2GiPTjUg1a!+$Q7FM_H1-h4Q;+i8$M7`D2}D^Nc%mx$l1& zWKv=5dkB-$_SEy3grc9qkR=>j>?O9?_n`jlly9+x$qrRIo=N$$;9OD020a!?u+g~9 zol<8w|B_)9Yot~;4akj711t+uAHd-Au9XH1cR$U1OlAi~9C^By9LJ9A+@BM&B` ztgV}f_9@3s-*k-EH-6ndUV8!Ro)h9R?fLrA&QC~<_56bMGvD|Z%nQ(mug9QAJdAny zh}^T6boPi6VUF*;D3XTK!KUF}wO)YD)c`kGo5!Y_XOrdkrTVCb;5QxvP{MFv1xXhOQcs&lO zVzJ0rJV^VDeboF5B72c!y)ic<$+nQo`uXZJNiX`gAF9U1CaU^c;X6 zI!Fz4zHX;ukj|C~bg~qk?+cyLdgHRw(3xqcbA)sjPoR^n=v*gsAaef;lP@b@Xei|8 zWwZw?Ur&%uZ~`6to;+LA*{OWpYo~)sBAxFmI`*DtmcP=AVgCV<0M%y6DND5x1oe9X z!^`dclb1-c`{9LZxBq_G?Z88CNq9oCRu9d}_{JX~ELW#~yX+<)SifDy1Qh)nPe-4G zK|g?3>i5yk0Un6)%(9tGU4Ic%$8>dGWXA=F4$HE~El_L6B*gjJlVj6C$yaCetB_$&3DfsUlJ&;xBP8L43Vt>T2sCV5 z1SSDh5xWr)+XqXvqj-zaeSxX3R)uFBhg>an$o}7f>f^6Q zrT_Rtf9l3-Pr1<%zWvkXw|X1&=WqW+bIRTc66?Z(?`CIcx1m(WxxscQ& zxvRl4uA~-=Hcig(#bY7#?|AG|isD$2xW#b$4^PAKI+=NBu~`Dw_u3TfL$x4YP=jGzDm4f+A!RZ#am#$n{rpacUCJQE-9K4Iib_#yK zVD1ukP~3gu9)KH)&1Troztgl=T?qWp^aFY%{7KlkZG66RpD-rio0+}Ul8QlSH z&S|kqajW3QV@t%nMIdON2u1G&CO74@*h+D`;l^V)!2uUXg8|TxZsosgvTf2u~u=f z7sz69+vv*Hs}@@#5T3w{$LLbQ8Z#}nMIc+@#$!*2`=me)iF=stz-IBk zB(4EB9t&W9Dju5-7cE2FAYIvE(_)1J;n}KqtXAAF2qY|SBVF10)ncsz;c3)(EH17l zkk#U@rMrg5R<+nY;%I|CtjCgN{{G*nLLQljk) zgy5NoKe6vp>lkMw1kXhLiSgl?h`)Xj7ILTT`z!VsTk zdM4^azo-vqTu7SSXqr+D3@NMkR3hGA_2K`4{&VI!#QItp>bchNC$tB#_0eK~T8GfY z#^;RG2f3p8jMN9Y!2JDHA2hMy(PHnb=CGz%#`pJCa}XOHE%v@@4svgEy1UDG8GN1n z{nQ!v_dj#GFd|EzOR$&(%}P3Dhqyd38IN(Y5RYvV2&W9tso;*t=&Ht<^pL5^iOhJ6 zGlqEVdBK)>gIENq83TR^TS7Tkh{w(s4P9movdU?yjv^am^l;bhZ8sf351xMx%Vi&B5@rRl_XmZp!9^i1e~o#1f35RW||m}=I*$-sz=u&f8O&2W4$@N0D=xxs=nonES2 zV?@I{gW*%Oi~D`}^+)ZD2Z}QvNK<;)8H^5RKE;%U@-v!Zp79u={h8`js!QuvwCHt> z{52V`HtSo_D_Y!!Hk?da7rb`QIkfwF>`yiJ7vgO^a1={6)(xR@DJU=Yq&2Br3d);2 zjrh$lj4i-zqLFo|6_}`Pz*1I!;6B8^#YiUmc`)thZ(!L5Wt{C}-|yHy!e`t*?DFJ& z)xSqX-iYdCt}LWw$-AyWoPqj1BJxHlC)^`BBNg0SU05vmZE)Xp9pVgDAVx&!D4F_% zQ2f)9#1uSg(Sl16|2M@+T&yZntv0>B*K_Ou#CO^rY9GGPrc(A~_yJO}TNHDT_cXiu z_n$eem%b0cCR$QqjkNRxf0=hX7UHmSS<4NT3ZC*ko2#%veqLB_-rrn|4uboer@H&q z{muQnzZnRj)c%e;o)sN(!#;t=3A|mHcf(MM#+0R6Gy6%a8lNH4h7WSlXP*AJ#1rBc_8`Jsm|E ziOE~}BCeLR0Ig{;`{R~(u%w9XSiIbChOc^J0pEx^=VU$UkdKt zd(rSr=0p9m1a!vBh1=X}R)7Ui7^`3bR9srJI9njjr}tow%LOj^OFI5O_Ed9o(cjyQ z5By+LaK8Msbz~b#0KW#b72?o;-}uhoU$XPtCx4&)^w3*5`pZMFT%7%~{)?LjXX}s7 z*r&s|I6D5(&QRYg_@QYK*Ttw(U(fx+=+VF>k7?_viyz$qlF{*^&Wode^y5d2h^cI% z)(GZc;F5hu`9m?$@eg-it^dV7*;GhA`D0f%g!&|y=D|4Uy!Jry$x8|0f%r>Z*nh}j zhIC0{#^@!Is!DLICOZC+&g=hNO2U2izDtBFP37g6#v+`+X>N}E8~8Je<>)E$iUYW- zU#I7&cW2Z5`SVX6)t?<2yEyyVMBaiK4`CM)CUANFZyx{(3o21F8hvx}9XZj#(Xqlr z_`&E~IsDi^c20EgdvbvL`zB^|@W=igYJ!425&akV^+;^l2DA5MOQGRvZQ1Jj*bmgs zCCtwUJEx<62BJs&Loaxy4&iss#xA~;y>KcBfRoO%%Evl$2=+!trjBJtN3viN5e)lx zh~||2c(xRx(5=UPw4e;*(;In2rZ!Y)W&Qg{%35h^#NsHQ2rRsyr2-$>TD*a5xsW5(~g)9`a4$WOVGyob$V@UGW8BhGH%XNtqDR<0p zz(6wmyI*BwxI9f)^n>!z&adn1Y38QvteZg@jUPXF_PE*v>;l!)aRiSUsE=PVz^b#5 zt_70W%aC@s+3Zw5+bB){X0Wix)+X+2NtIwiraR!F06nBCvo`NeW65p?Om-##>qD9O zx!J-pFDpR1D_FQde)jB(R@mB}(Ms2ScwWJC$zzqSCOjIRUG!soD|?CK+sZT7N7dkR zrsJEM--SX;&0_H$!;!}dgV@`ZvYY2QC zUeYgTM6oAGj^gf^OQOHSFQH;9z4Lsr?HtRA&_py+kOhN-&=#?8G0jI8W*Cnuj4WWJ zXnU}y&ZCE*4+}W4SZJUr@3atRVeQ^X6x?Ev;g4oonw}aUx@W@_cTn<&E5XTV*h7;T zA$4%mijy#tlwXIS54qzkP66lxKvHl?3dk^1uon{u!?FRt*$2bcY1WhwtZ+)0;(kKO z%+!Z@cg^wyFqI$Ke=mKd^tsu$dY6B=d99u+`}^g; z=$INdE*1gr(LQPJ?Z3E4&s8BgX2@mO?3Zo*)Sa1PKL8`=^4q)}x0T=KS)M!J*aGR? zpfB>4Ki{Ri5|QdLud9Ix!6KLtEL@=7hMz;lxOe+Ub$?>kGkqsI z&V_A9wI_h`F(P5?&gVi_4r91Ql;@W{yATm@bAiLS09icU`57plms9dXTS{$ z4Gp!8{eL}Ux1WLy(`FEe1fH#Q{eViXx>TtB6y(H4cK_7R(;b7bO#O&vPUJh_F~h_a zM`u_LI27{|5OHkg5*#E{ScIE~u)x})unrR|ul+Oa7esanEyAsz^|M*2oA&8XTUO`$ z6#eV)vxSQOOKJLPvsa7$6(*LLy~^<-tNf@#rAp3zOA9iwSFv{qj?x@B4P#vINi)Xr z5vH*_Rh;YE=bK3qp0)tyiVkgiQ&=~dScIpsI4;s^*UV%DreH1;kwFnTDnrBFT7|gI zBo{fHMr2TmB80%614ngio~x!NZXE;we(=WC8ESVM4ZMWhVH>6GPaO&2yySv&~`W#nqLj2`#<7YFm03_yefQY$V9pJUbvp+zw&8H!D z`Q!fH+fik5iX^q3lT~w+VqfY*%1>*&;^UTiV{$4_Ae1-NtHALpg*@ zd$>n7LdfmS6Dv6^B?+|7I0>0bD>+OgBQ+?idgD^ubN~pnhOZ&Ef`$$MCbSj)$O?@K zT}I(G7)Nk-J6Mh52c2n12lI3>s6*nF_~krhHE4Vc^g+Ck%Sr`dBlwT_#2k|gS;h6n zO$e3shrPk_Jvf+P7?ATAolqJ@c#83qAfhZ!6)TQGzBbz^{1+iRtKP`{G1=weXQo(e zeDodlGZRScUr4>v%j|LO3`)HADVX=-$Lozs?6V_bruw0E!!t(O-C#ZB@BI#fkzHJ_z?vAwj`(a)>a-eu z9vgm88ttdBaMvG(I%Pb%6=flldt=?-O9gW-&sqsa8d2|I;}I0(%_oXcqdmhlSX&3t z0{>loNJA118m%g&f;&1?7po0bvU^lXN+Ycvm+@H#FFX)x@$y4p^l#u*SXY6UFjpJG zM{i3elSZ}~&EE%kpG*;l$!RJZ?T89?^XiQ)8(|QJrq4z~2DRKfJ~p4VYYd!_awxdN zDu+szgW~SvB!HeA9rT8cHqc=7C5T?_c@Sd8b;rk=g~-=P1n?A*j4ZyiAVmbf!*Q`m zggjJxAAl7Xh$v2GIXGzyRk9QmC*QM(1jEL&($!2(d=Fxq*5c&%umZMo!bMq&$aNNx z!bq)D-spFwPR&~;Su*kJzyq+6vbegJ1OY#7)+Sp7i%f!dW)ei1#H*)22>T|B!!I~E z%*f_WD7mV@OH6{7{eR583w)Ht)jz(QY+!+fU2r3-23=vT!9CnKNh3oH=tlV?@Xl4qK90&23Yd5~wp2_j(;!zE}MD zA+9~__Rp|}OPntbAd)gA=b!r;odA94wU8biO_5j3(a{u|!zC{J>Q>@*qc4N~lW6kr zYamQo3$MfemSrqe%Xl>$1wh*vYGK5SgW_tzMF^ACLP$sG#nAw0N?l6bTWoQhe+?#A zJXHqHU#26O?iIJFNRVT=!~<>*W->N|~z|c|a;jn*^fcOn5y(po62Mb){lyfQ>uJI$0u%rmR0y9dyapVmHNdc*h>m^ zneX+9R(xcw=@T0$-Bb(pXOq-~Q)I$vNO)f?;Yv=3&ZvmeW~ymN%CtF1dqXVkFF37@ z5*Diok6p>RPeQ`tSi&&~hPLMC&v9%dJ%E#K(@7nG*_nL0txU8K+%!*4xlh<)aAtS7$ek(xL!rNnT7RqBH z+Z2+RGI765I0;<(_;-3~_adlFEaZjpla5Umn3(9fbxAPde ztM%B>$J>xEUI#W!M2F+Hudf=>=sOz+d7-}WGPKc`nLjlHo{T5DF(4nn=itfPD-JxM zrnD%VjLK0aW`;}hx=&H2xD;PTcuIEIm(x*_2ii>(g)4tLm)NpeUKQbz{P2{b?tvX8 z`SdYdQlw1DP)c&}eVF`SsI<%pmlVVMjje4?M@gYfCg0Uj#Z%_E%0Qg)ZO0Dix6*k1 zW;3WX{VGE?5N$B~9QboW6SGh`pb@jL^}Ph2?an&b(xF zbqeP(19`|8)y6VpvJK`jsI{?;<%s1FKn~{+=9YbqK?i}zCRz_btjUblFB+Qz#?oR< z`~VI73dZv*BcT(>QO8z?a;Y1jk(D-P$VZsF1U%i$pv?ASPoY`dhm6q!WXE~{7xe%c z%q0s7AaCjW@3jz+`Or6&;yM(By9B=at5WSQ4Ptw8_Sq^F1jJ^bsWiui!k`EQhlWb5%g}Ni1@=ws0p`L zHyL6J7RqIeK6rJJ0WHywR?$=4Acuv>Va&Ky>{5;HA@%Z&mWjwyQ1PiKREGG4iabT5 zorY67@*S8{M8(4;goBW$GxBRm7p2pkmtMa4G7)(ykXsmenu8&CL#a+I8lC-99g9w#IKj{+)PB?56Js7^3TaHGAQrYEAr_&@*G0G zmXUu=Zfg00PTV$$a3b>lKu+d%hPYcr-oIDm$ERqN=M(Z`MxMj&^yvCdFJI!Bh};U~ z0~mRpiagE=kCT>%bmT>Z{1Z&Mj2X9wrtH$`nolp^O`C{(z>-WFpk;_XLULt5uY_Nr z<1QuKG+#7koR_ZGOsDHWy?iNXJZ`8^YM_G{cP(&pL~kwVlgS!Syo5T3Q6FWV(EXvP zP5j2Arn(yhp4b?-TcvwYuXH!*$fpzX*Nze0ow#jRNvGRIy?n=LJn~Imcd`N~%Vej2)}_@&xf))#(pl}0~n zt&13cEqS6(r~6>Nd@HO0Kg~-pex6#&5NGy#kGrOL&jw=`E+xvcN6`_qcuyE3PGsdLzx(rqczpUcP2F9`*AyU!ihFDz9G>{+UVe?=00g!@6rY z<1giwMR(D9H_>lAekcQ%XvTId1UzB`c}B)KGk%1l&I!Q&TNiKt#rP{lHZw7bEb`K1`%Lk27$i*dl$Pg4Mays5qNbgf zpF^>{XfmakB6G|IwVu+2!)a*%v=)mQpp~NRp_`x`fUYQFImSyAUNN0dVm zl$abUaFv;+>5IjgI`CBl3_2o~qkiX^H1#?x5jdyxWdkbRBE|uBzItgfaKI30#-?WmVuwwfm6{YSoBkmi#O!Ztl+5q_6(Tn z*uF5^Vy|BgkyWP5RD4!t9Icqvq3WVvlvN)rkM34V<|a$LC06D9nOJ?T z9#v6M(ei0(Md%;jV@uc@3~z~pvBbexdZzX&zDX5j<*+9XO<;9UB-UY<6<9aPs1AxT zGSrp@=F-69S{|@fVDd~xlP?N=JW{AfWB5bEJ2$63M~|lUCq#QVdWarPb2^BY(}71Y zy&`eb036ZToO+)gjcH6mA_v&p^=O)ELv$XeenyW*3?a$q===3(OcoK6LXNK2qiN4K zqKi2C20fZ|7oz1tf)CO0qhC))(x)#T|m{MAvT@{|< z62A+wn9cP@Zp^C`E9h;eXIf-RVMUo(LT}SNb5RL?V7nH>^02QMG1J0RCRJc}UrA}$ z=M{5d|Kjqd+`W9ea|INt8-E^5=H$s+pYvz`3NM*8cKe1Ye%erKgHU<9`^oh3BIpWA zA-_~1=t0?BbO*H91!=_m1hliG93N;npNEg+(owqz8n;Tdp;sxgbf@GtgIKrX^H!88 zQ%WnmO39>h#aE2y%(8OW$0XY{+X0t22q{zMD&w|-7>a^GV+n|^sER{|buk5H1rA1r zZnLBqm}eqlu2*dr(!QpPs?k2sfUpKsQwSvaN{N?%y|mhR#+BICPy8Q8(;tf*N;=)k zO=n-yDAtVW@2AXkopq}l+gxyWh#FR_75(3y`2Mf=^+a5P1p&(atYDkHo;wG0HmI)B z@I;$Zl#%A1g6XV@4y2hB#-(7GI}G3C?3kDxEHV{^Z^{f;WrQcX!&5!s`KUomdEk$v zs0h4wmwWM6C?36?8)s%&?qP8+MiH2LqKQHS0uvG;v;jY;unss2> zghcWXu^du6$Y&FPgNbB^bl}V4$j;-Omm~leX}}uUB|5Mxj%>#O>LABT-~?KoI>ZT5 z*($BsoSjwA&JvoMZB`*Q{=WT|#-g_gQsu9e^V<0vjYR~RlEB=Db;u0_sWR8Yd9F4< z4ojeRo({P>j#}BR{Y;1KUpFqv?naqP-m5rbkcn zcu9dzj@Y$_B3>m2D~!?82ZUb_P^fH$etZXw$x9%ml(;0eln8%XB{{{j%?X}{}2x> z+pm%AU+cib;>ecmca{;D+AsCjIG-XGu8{2)Cg!c!j#Hs_|H>3@zf;hDOVEBx(0+Yr zza?nDQ@H)k#S69H(zy29h7Q`kg6;r#)L_>@4a|ZX9Q;B1MD=FCB&hM^i@R^-Cg&*=cknQd8{91r0qB2^ZVwgeTfcyUL4s=xvL$W0PNO)HL{Ps zs+HLiNA>~+KCsAGW`_nW%>%c1UI(TN2sLhB%fL_Sz+@g+5@@c|A!*)LWA$`~4Cs*P zePWgmpnGAcHLgM;(1) z3n5H{*uy^G53~{Ht2Tm{3a8o#?QA2^jlYzE7zN+TtYb1`I)<$Dn28WKJllDRrX4Uc zBh4eb@eO+PBu^=I%+hjrSdYej5mFk`atQ0uh#@4>a#*NGqZJbpIrN*MN0Y)uw397| zVm%r$ghcKEJYSDC%!r?=M^m##YH2w{^ECD4i&J08O@s{b4O|Gb`s%?ggZAR}Z-2c0 zI=Q_tP_}`-?S+mKCz6?9Gq3{tVKzfoAZ9acf37zje6py0pq2EaXjk6hk zwjd^;z1j?;b>JHa*kCh^NCZx_84kRxbiH4r($V$-7yt?V0k7Sv{!iV2Bq*#AWIzt_LN{?ZTb z-|scF596LUqdm>zeR3!Xxj1S2Kn?5d6Mz%j$But!In&`` zWBX_}0{0~QE*;oU!0J#ywvUhzxM%w)*MYByBU`qQ5+g8bNNrr&P#|3groA{C*+K4W z2k5|v}GtdyZiHvaWrdJzJkzq@Mj#r=k6w zbUZup2ev<2i$(v0lM_F5Oq+v^@lbp`ruFdnFxi;4y+dmSJ;$`q{W_ru(V|p*`wQ#9 zJ;$`m5`h!j-y|Kl=a{xA0XV3&0&OU6*MWPEX;Tw`i!@+OZR~2-%G`5I+wPAmb8lnX zdvxHQW7@D0m^wFYO#9Gcy$SxPF>PaX?w7nt}$mEHhl05uV@AORP^&a^0e&JupDr?#A|I@&UB0xJqUoc$?lF{8FNO% zGm^bV2fjLvY&o`VN&rT~Gm`yZIY&q1M91pAw_2S9S(1E`PM>MkKP|u+Qrw*8v z$@M}L!J~Qj$iuwl==Z9s)Ir{4o=BSP#<~@D9ZbMv(gaKd*FivVe_8#wtL*NA3o0hYXvA z6T@V149Drdy_qT>-uM@n!5=$xJuS{iyTc9jq~C@Yl~^(?8JRYvPH z&Uj^OGhR;7+N^4a_(^!E2ai6)Hdx}<|Ad!1p)Yd&KhhVp*$DaqvhYLo#a-9M^hJnA zawpRlBT#5+PQB@ip}#P;+8+91-xdwHr@nao=Lx`x`r;8CxTn7OeFAU~eKAi5?x`<+ zmH^yCUyRm)d+Li3@xZ<5ivydrGWXOM`{rt8Ht36EH&XPE*B9%O>x&_vCb_=o9M!A7 zcv_D(=!-w-(FT1H(xVOfV!j@2&=-}6{!#kkLyXF#zW4`^&ywhi8(!=~U*yc`RbSk~ z2ovo5GL`r^01&|?)UxxOeEsp*U9@%mzBf_}u*6pBGoEG$J`q-raFFOf2+EW#WxlEW@ZFcexL{9}02$#or(K(1o*GBsKMU7vq2v-Nc3k)NrdN-F(7YhmG`Zv{Ky19G|TC}=X8FcSg@MB zV&2RcyJX%*BR|Z*1Adem`B8*x9JLvvxzw>=%T@dMS&|bd|Hk<8 zpM3uFhmJ3;5D1Jf2mkQ#W!K!;_;M=`w~~!7=WSv&(CeD%&t?!?)J>1l%r%ZLN9({n z$Co1#ffL7<2R3Rs_Z(mD`DyRPym<#fE=pe0d@x)|JKWPWxDoHjFP{(W4FH z%Z+-pVSKq(k2Z`in-HzKfN@v&FXhI!TQw_v78-N%F2qEOGHwlZ!TOVrH_2%x9T?2V zp~#(LC#C_a-Qs_{Q%$rvAzU&kFw7r33*JJU=i-dXRtq_fYpblzkKBlkLqu`sOjF6( zO`XC0W^4?D_CNdh`>NAFlS)wj6E4A=SzHEqWVJ@tY(=ti zuQHz8V>Qss<2aKA&hu`+m4?(SyYRJXjRVmw`$q)dHwQm3A8xo8ua3r**+|j2=6w9t z{6uNkh{(t2IB3mjj{(SBGwd-MAJ+_`x0D)-vW<4+H8xy;$hD2M&)jR-L{BC#E4Z1^ znFAv`8hF_TFCBb&k`~18vnQ%#rwr>J(#=it1EjM0HBFrAJJfF{YxrA4LQ=6F1C(vtM;}f6@jxNYiO~#yrO!zpJal6yhMZ<-T;dJhSm+}N7?Sx3M5*y2ownj6p+WAO@QSnaF+W~7Y1Cch~B9S+}y`PU&D3(XE}wF);7 zX5~%~H8goE8cuS%`|(ABh%z34)%8^sYHp_(fe8!T+c$esMYTzM_i?HTcZyq;p`;4@ z2M$mkxMdtVUpzC5b@YSgDMry4%keA)D6 z8tQvMwN*>BQ%ui=p+n88%z?a@&xLbg$_LmGS&kQFyc^g`rolZlgDt?@PVw^`faz7u zHN9g8rqh*UxqCbMbJZPQh620JFLQlCzgiiObXBOhUZKR&zT;cGc!DA zZb$!YH{ASpzztL!i>k2~*o$rG+Bs|7`)GL2Z6*$OG>BZ{1M0Zp07AHgfq%c|-=qBd z9sip0Os1-Eg9VSsW&*-RV+f-{`Pad}PX2ZAZwCLm`4$U`3zY$`5pz?=Bk zM%7l~e+O0Mr`;1oHgAR&N>r`HGF!E&%3r8fBC|W&@6lh^>;pnn)tsNeGSOkQbrLI5Z8R%Q-Y1 zp&|~=L})yR<|1?jhe)kl$st-cE9TIAgsM11Drh=~Y7pAMp`{3waELm%Z5#?BG@3*8 z2o2&;BSL5#p!rUONOa*I6Co%hgjOSz#-V!=;^|$!*N-P|_@WMQ7U>?v*8v<_htNO{ zJ&ur#Lr)fq2;gkIrLCqmmfv;(16In;&FnH+i@ zp&SnFLFfVwy@QaOL;DaK#-R@pI-5fRp^+RqfY2xo9Ylz_dfZBZkcUG@5juxM-y!r9 z4iTd+<`C($i#SC6r;9_RnNH&nX&VQJNN1nIAyUd`afsBplS6KVPUVmXp$j>biO^6E zQHOm#hjI`~=TII(Wbk)1sJ@iV!+$Kukgi0*#OtA+!;M zrXh3*ho&P`&Y_tIP36#BguEQO7NIf@`4PH?L-P@u#GwTUP3BMyLK8W(6roZM)gp8i zhk^)UUp(@yN9bw}H6rv=4&8~+-#N4jp$9m$8legf-HXr!4n2U-SPngmP$!2TMW~BI z>kxX0Lysf$GKZc*$j+f>5z64uMuf(2=mmsEaHtuf2RXDAp?nT?BD9f1I}kdLLtO}6 z%Awa0+RLFm2))ChcMy6Pp^eKRIFU6U;x$ql4PX6Tq|_X~+7c;E314jur{r#r+-jry zqa!n|q3~IBV?c)`bnG|Fzeo!Lx~|m$z;Vmas%o3(z>nsP{lCOi7*=sGo)z)qS!=xG zJBK=$$CLeDOWkG+tx42P_7zR|MK^8rFGUA|`(aW0N;)}z#juplF0ot47Ll>j{1RAU5|836*;<9(qpv2 zEB2f0{Z=}*WpAtLMBiFT9&X`g^8V`3$TJ1(k~A~*iY}CoxKt*VqRD`nYWhE548%-@ z3s$8F&XP1lKL;XNBji!nfi4HUgKYs1eI=>vp%1ek4sG@WzB`=ggyG7UT+RsR#Ap=W z15d9ut5qIX;{&M1`&XN~Kjd21T-K<*YP@0{HuGt28X;e<&2j64a}(x^YNUv<_m2$h z1m_b-u>a~&6XcZeS~@?Ax}YaM*G9W|I?k;e6nC#f`QU=D;JD@q#IQH++rbvND8<%S zpSTVTW5jZnWxIp7?WO$|?2>wWKy+o0Gyv-4+~2)|u3=U{Wv};k;E)9k>mmIB>C)BXJFK z#kputK%LfI&9k57m<7EPU_AHt)F8w_ZVBZZSJkOW|!YjRlW>2E|1 z(e$Ngtt*<*UNZt`h~NK7ox7>gS{qJ^VeWN)o2bPno)z!$NiMP19k2p_Z2UyIMJyh# zcm#e=47b00=h9U{xS?X7-Z$MsW~+?->Sh4iJZ19jPqj$HsS9qS)PFBE ziC1q-HSt|bV)wnM#XCKe7lt+yz}LF1LYtjvgC&with`)Ikz|LdP}!{3arcQYLQF@XhmT6QgH)veE`}fR6q6l1!9wDlUSZ%1o70hE{ z(!+|GZ_1!MHSG1j$1gkI$ijgen%to$Z4?ZNRQrmvU_>k9osrV}L&rwh?{MJNzCK(y zW<2iLh#brx4}YT2zH0~wV-DXC+G>ZKVP$WRu zf;`Z*oP!fIaIsI3s*8PcpHB_YJulUy0VzHVCpi(gLtgS_k`tA&B!0RVZPT6T7{%g3 z2yNP?*9XrqiJzg{-?Yz$(8DuhWUig-fV(BHrD78WqPw(w@<({Sxdzq#5`;^o9{$j? zV+m-a+l<=L01THGXpy0#{j2Qt8Ne|P#R}S2{070bbh(>-!zwa~gD<4)qv4Tqm6PQ< zkd6;zA!{E3mWy|Fr!>7*&{zaT6Sz<_6HS3^u}0uU*^$t3%IP4uB@XG zZ^6p}OZ~1IYe6H8aRQ#EhOdDSoMm}mIk@MmTt!$(ba=|MaWH1i0aDY9u z4;bw0yHa1HGy5;bLn60Kcs zPhtN{_2B4h^71J+!2gA$40A>tjFVx0^M*2*ZxbAQ{QH;$tokT-yy;8)Me%3L8*e%d zf5rH_=+g0~oAA6He=Yd?5`UvE8E^U+f0yEKHvSgj?l#os4TtEOS*lvGPvzhT4r z>;J3+h7BA<|7?SY4Y50h)*V=d^2hokG9oZ#b|{)&h(?U_k{t~P5JmqYCG$7Y0I7rD z;4~?;-yHa|(*NB^$RFgpKg7Jm!^h5*ae08|Rf0v?%9P9wOWm&kr7$k@jpQ>i4enjL zElP3wwf+M@Q2i^Kyl&WBn;Ov28{$QUw?9_#|g^MP$8x) zDhUK_Q;4=n?bj;P+82Pv`Q_ef2RWip%cmj#b#mnQ67pY5k{G$M%ydZw6ei8hq1bVF zxv162@ir3P>RyX_eR8N8g1Y`kQZqj}-uZ-g{=dUQ|6G7TT)wiv>-IDm{siGT7O=eB zlswZ?%JilmSs0i|$>gw@@Gj_;wJ`pYK@}0y&52N4jSG`Q6%y3KL?|x#qU2Ed1hps; ziu0;T4wXkxHHlE17mh2A zQil4G?e~`C$X$f|7D>{--F|OPj@LqXZ~cLI{Rd&AqOr7_do~b^K$2CR091AD56nYJ z-x#Gi3(F>Yl9h=Oqhl}rmi2ol%?dsB&L#VR5TjPtJA(yoynUWc2*M;Mtuz z&nkM*#_FanIc>xGgg5a#y- z3QA(_iSJ{*s7mCDULAbppBKU}M-jB8Ae zI+IY-_nwTK)rUEU(`)2=jHco--3>F$rc7Z6O>pdlO)r>}r-4N0F)%irNBbneq>Z}B zt;9GQ=kl;W+k6-|%ZBzHC0C-=w~(cnFxW@>UQ*u5DUGB2-c#0cN_Msm8raKvmsfoL zF;8>=q}p12Q&~F?w@mE~-+&V)5J7|T>IJf72;EGkCep(4Aawk7k^Z$t{~FN0F4n&; z(Z4Rm*LEIqr6>uiP#c(faUCG@2w5%Dku6t|S*vf;kg`Qey)EC)qv zXeCXVXi>`Xox-%SfNxY(s;mkD(N$5D5~t7CG$PC?DL|L~M0dd-yhCZ&N*{{yBP%I@ z)b{lghbn7Km|s%L5laD?c9_yoNU@Zb0)&~aBv|t-Uevn=PWvf3_lYiVWMwvH##BH4 z7DNK;2xZNqh-9o3z=)G5ri%ntX7tljzj-N8RC&r7IMT2hU%aA)BBy2|Gh2T>v&Rt` z+KT-+;)643c#OFS{cIEkLI+BFu9()D+gRk{C*w2NA4p2(X9cLB~nLs zHI|G}?s9`yiRpi;;d3i@-P_Ce;o5hPa+d?VO@u%4Q|!&c4JP8D`?1!=jTSc~V9|ry z?XEeq3&gA$0hjhgUx+&EU$Qx4z8^EN%RWd&sY;DCq`_d5i3%ofkBjhi;%Il6$Wzi2 z^aN`Abxe2D<`_%0nRY_yR}x~q%NJYksymPg_G$u9@A2TxumD!?p^8zLS#i-GHz)7( z$P*mEDIPvHl#SDEIrz&9zu=n@58fejSq0L=&r1en&G&u z!isy>v0TwTbR*=77BDiq`zdW$PRqo{bj)6jTuTn1$<(1|bXWH&YsphRMbHxwyIvVEd7iRRSfnDsoewh)$Y zxIfk)DbrJtsYglYT%mtC*RF1-^q5a(4QJaG%eF;03^~^zXQfk#HaQ^v^}7N`DBG+S zTqf5MZJJ7XZVwz$I$QRqeDx=#GxUDySC3*bCZBF&$?y{?9t3p|uTTe;iZ!mB3m5}e$lwErT-3XpKx#a$D)C-6 zs@K1m-aK+H1>;%FRIO{yhktDD}4QUeSX9-;LHd3Bc0?C^^ z2^>9H0%y`f6C&uDR07}c`jHaI*+JeoJC;Ds4>6oy9};*Yviy%E@Imyfi4r*Gjs#vC zB=C^~;9!Cd{3M657?jml4Sh)9Y(mmg0{;j+QUbrZlrZ+910U!MZGRPQOagBhO?VO| zunI_!J*h=q2gXTYGmaDVkib!ZNiKmA0$~ZknTyL2zn-!z&SgAqy%zykT=ebC6Mz&4CmK}1Ri)fnFPx7TR*TbPM5u?WU$&7 zKV6@|af2M5@hSM2Acu3f$20cD*8@vZP536wTlJK~;lLy1@P@o3a_H;}?QJUBm>hoe zliuX;l~A8@m``XDHR1h$NiK(J1j2GyagHX3SE(UQ4!tagH@tzACzZoOnwf*x(Uawn z?v9}ddM1^_-7iTw#QI$?mSNxBG3N-u;~ZHOIZMQFmVJog&ynkYqzqSKJ8q&f%!c1& z1G^1ExQ3?65`^$=?(~d8_;FnyLRdyfdJ5rhfkz6VxG0Gb-qjb{Z|QUa(8h#tuBSI4 zyc$T5E}1g?8=*-Q!czfb;EJI;4iX3p;m(no5N=gNnh=(<5Q<$$c~T*y%SA}$=*dDz z_aadQJ(CJy`Su^F3^_Z<8)wH7$oV0L^Xo$b-|PGjC2)xBNDXT6ueT-e+8}{WOx`3) z;B@Zvj1qV)uq0K3uY3q3JtfcqJW>MZU6@1y2ls_`sfsoxf&Vq7!(AkGt|K&wf;b2; z$ptY$AS{S&BQ!zWq=qy>%x6J-_hqC!sUUW$-7h^^5b1I|5=43?6~u{Ke|&$;IYRO{ zN0vp-5;2@*AF}vrTQXVvfkq)6KS>nA2jH~Wz;1&O_S*+0CiKTwbFXI{tRh zKg4i;eMsO`WZAnm{DBgM_eFhK%4xz{sF;Ok5J5S7abNlyt3 z0*{oyH+g8;iv%v~3$38(H=vD4;1nGC>Nz~l2a-M{a4n%plt2q$3|uit;Ee>r68M5k zlfY-xkS2kdEP-!!BIQXXkZw{Vfuko&V5w>%(le<97H#>F63E#>-Z(p!K+X>_oL?Uj z`10mt68P`+$KUW6&e$K{4fn?emKy}|IL&k=2;$}3>lp>{8emDPv(^)mo`QG;=Ov{e zPG-7#5yY=+`anBJMH>^uZNqyL#3zBI4?%PhnnXeT4PXphF$m&EZvlh_G51tW5J#&a zO%UBIh?Coq@}z=Dx9^c4(vt;|ZV;sidL|Xb4KMuo{+M%wO!&&wri{p{& zf20i;j3Sm9h0wMrf!zinT)YQNOc287xYsiZVLLn(Cl$hr2uV*NTnIc;2s?Rf*^3a~ z)EC;fX(A42V?tPz-kT7f2PAz6;qM4dq7WXwIe{w%A)HGfEQC*-q6y)nYDg182Mb|m z8&aNB2@UgZB3qY~lkVDY;Q)4aV-+#-!3ibl*RQ8DB`|x=<_6Af?)SMam>Oc0+z&%j|EyOEcY<{6YHJadBlR95O zPwY2Yb0<+=p3hsDA}i?)+fX76Ou`Gy_zI9fdF~XCy@%X-*=iuqkMV{bhteM>!<0kz z`p3XS?5wG|FeKn8^?kfWR_1_;F;gA(6}yPRauW&d!`fFsJ67ZYn#e<(Y7SC8PN{I9 zd#3UdpTerYUyYbc5z0|aK-=r@KwQDNF5k~hi*Bphl=JayoFBXz&MD0DCD30Cn*#qo zX<{#8tB_eLjx*5n`uI#69sp;@Omqa&M8yqM2Ycv!sw2=JDa~UMv&ISDjH!|_uTYu> zFU0_c(nOF(D+2SwU+clrJYCe_r-LupFJ#Gg)*+@vQj!l8Gu_$0{>Ktv_&`(S~Ki6=?EM^8>i)`SbmwL_4h18)C! zlsS2L^S`H6*#V{pKXf(@2esPMBKSp>t-^z=>^1Dvkf&V#3(N5EYg6pOO{J#loM?I} zwh=1n*+>Z`<-kV7^yw4>M?i|j1Ak0FTIPLZKEAJ|M9?uD<0 z8UFJ#In9!srAK}Sa^A%+$k~SnlT%FO&?nIZa{P}Ij&G>0$q7gd#{&|FW5X=q2;dhu zmg2!UOoW3zg|@o)UkNmjXzV9?A-12W%&>U~J<_$0AP?Y&Ya%M*xI8#asxDOyR{zY0 z4T&SHP@djuYxFh$*SO`9$WYGDrzAc8JFBq)AH23|xr1s8RS0B{VjD*+LxS+QAbz8}y#9lH)JQsOnB0UaW48^z z!&1CI4+Qy1UHT_z)$XAv7k(N?Y{SXR@VHL=0y7=M6hjD{L(>2*F30&~@#%NaMIN4F zv2CJfbeG==c(2GA$lVYQKArDBh)l#5%o$>>85_EsE1Iz%$Bjr+%^3CYqS7g*z@uJw zmOlrK6u*s6Or92MaF;0^moG=c%4d-fd%PYY?;LBl%G^UcqnjuQf23{@VPhixXMje; zsA`)S7mt)EKu)HbTwtt#dD)#^?H8vfCV~1kA@9MIcNtP{`V1*)e_47a_L@Di4)sMI zALxa1?oxBUNYA;#PtKG?GkSjIAQ-UXaLuLIzX_Ii^eaZ~h>zE!GRSLAWaYk5RFP#O zbrbQ*hCbso%u9wZAzPyRVt9>}p-g`cmU_hvKuHLj500Ws zbV58{Tx>eH&Km-*iT1Ng#1KUMuE`VIg-vODf<2n6>B zzx;+e5>oZIz~$g3*5ZF0jSws7kFbS$6YJiB9K^9&eLoK&KKFlQ3_`4o9vp`dsT48F z4^l`{(Zy9Tb)XnFoY5nJL(|LLnc^pOz(dYQ=A-#U(@khRV(gVTYdjQnZ3TZ#V(;JC zy9>K^VRsZ>8yG0vQS9=vRu-T1XG7WQ_d|rrL@5sG(FQO&S^qGV@RO0+ne#|?s!3SU z3_|1fRMnYMYID(4*iS(&7D3m(gE*zsqB=3yR{${nxcD*+f$f4+Q-w0(St!0r<$O9) z>r*b-h)0z&?gc!^%NG5IeSn#8$byQ_gqfT%tY!vC#a`gu=rUZ`2-_oFU{7!y9hEi( z`hg*Dbg$B&49#@VRwY z>~p>Re5wX5CTt+<*rI~-R&Zb^i*UxF?^UcU!l47j+V)%cHYM+MwVr9PmXBIsE#EN` zjI-D8hvEo{6np)zH~_CehY^qKX(JDjJxZ6Jy6`2kl5Ej}7JL0bdRs$wC}>`w?b^i- zTpB3oCi2sGfyLY2z+)2e+blFd))0KeJ-m{~G&{w&U$S8=lbOWzNT#H7y4z`_gWI|r zD5cnibo*xkXJj*t7jTotim7;0*6?Tp!xSEEz+VxV(C{rxQj7wAiXZ!mOeEX%;d&^6 zA(-k?(kVz2M)bspX1F#GQC`6yWdFCwbQ6tJ#6HZ2B#vAX62D9os=Jo;@`sLMfbchb z88gS>#i9MimBay%br(*X@BagVlvpZxt2tzKA6lid2e*r6l3{{l%gRyJw_Y^;Df%WV zabrX__1kXK4sN_v)z|trlMR}B~90sj)30eBFIX6-)2K7+i{n~1{J)GV{#z-^2tAm#|2;g`(tFz~?O*(Nu?64jT1^nYvhs5A^pi9NU_so^ z{>$82_rbwvG}>`HtevR)mhq;JD~{p|9$(7`88~<&{+sGPb>cVd2$x!v!IWRP)T(9) zubvw28k^eBaxebS&_UL0HQec3$Ds&Fi@+0A)kDGuUUNmbwj+$)p zeLOyR?6f5*7I)K-rniFKEUn1wS1h{8py! zZ0e`I&z?c>_RU@P%`Iv{S=*}Tha5@=IMSWU`@d9vAbVR@Ye9)+@fkSEf=I8@4`*t& zz=WG(3HQSQy4_+mDVHj*G?^Rwkpnv>;>$U4lPelOtnlDu-G4VEX9pdqvH6s3Ra6D& zubMReL(e-DdsZuaO|(=*rt9^iofpVzOKmThXqmD2G~63X6flE}N4(Z!!Qz8~F))ZP$=$xSL_aRWks^EoiU(x_e-gC7(VuT84t*1uxgWN+ycI1eE|d~aXYfqT+xJSb#wh*G=q+U_8H65=Afr;L#MmYsa#xeQD7Km zr$Q~3P^$%Tiw?lRxz4`+V*C0rSw{jBpvI{BTg`~}>d_a(M~~5?N$KgSM{=||>tKy* z#bNRZYPxM`s51&qknfl|O)azAa+~AdP+w?S%Fr-MwI8N;l;6=-TBv|rU%I@sqb8lo zQKcQir0@C9YE$+Uytlj`&q1~2Mpx`zeofY)CUfEVT36xEZUfVYjBTyCz`nWJzIj)u z*E0hxq*=s3}lehE+1SKS!l+or*FS{ROy`4UOe=B(^KZzZPd0j z36cE~w^!DWT6x~6BFWD^9J$rpbUKL)wawkZWv27(tJ~`LHqP`oYtr~ql7cUnWj1A8 z5Imk!n-)AiX1OzXd_09pmJbXb|9Pz~czoV%{h^!-zO3C7`rN$qvL@#RO>YOgbArbQ zEU`4b)}29b=vC5|qy<~IcMqo5pVO-|*!q}#{jS$O02o^Tpw<YJ9 zwYf2{rg1eUHkR8cJqc@QtE;Wxgni{F6yKQ}&3YLOa@rf$;XQN$j&(da%C?BJU}5^I zBd^-E>awpNKu8YN4AInUf2dcQyTP2)fDkA*r=I9e zh5o`_98Rb-;|62j3jyFPZ8#8jMSEiPHyt$m<@;1oDd6z@+k;2`<*+E~NRm zYsX+{C|w0_gTD?)EVlB1`CleT>~Z@_8owy5kk~dMZ|(ID5xyEQ;8OeMyvtzHe1Z?5<5JYyBF+mJo-W&85_zAm zSCqk=DAS`2)jC#>HdN~hPw%QWmjg zl?er-H08~#-6V}~)9p(HX}^nx+h|$Tkg0XO2}=TX?}R-!wqQ&z_S~=R>qpzykIgz^ zY*$z7(S{1h)uRm+kYQhsQjE9YA3tWM|Od@{HtiRQjGp9!^^83 zNcC!MiJokabC=|*!W|CqNjGgX7>1n4!r1Ca9N_Fj<2DX(sw#Y9?;|pc*}5H~4=im}j1H?*Qy3#Q0o zg+e5}!N`kEyYL6BiT%4jD^i@=e zUp$UFL?cA4+ftzg+ATjNIdCZNLIrFy7jSFE={Qo>?)_l|v}?sO=SX&fFye(d6|#t=WOVUIQ`sJbIK~}*q33GHwbi^NQ;~kCP{7 zygWV4@^rJstc=GHSh|>LLs-{6q?2$9P3T)XKWhn(w=DTd)N_yj&he(uJ~Li1F^E1! z2Ih5)@5guFw2$vkSKyQ&Rs7$t@J@eI@i!fRKgS>854E_;#9s~&jhr#%|7a(IcPQQeH1%W#?pMG zOiNl~%XEnsW#P0nzur=aOO22d79TlXP1Tm^agfNnX2Oh$> z>o->OM&dvqZ6guv^-n*2qG|sFNFu)xAMlMxSHA`IZ^R9P!$W@SzD@!WL-2vhqJEfy z+^t@Ag42Bk#L8OczY|}(FSW17lxDfVo?b@V;kpi~YUw3|Qqjh%sHx0fLooxmM)5+q z@8J1HE7rCOZnQ2euc(U5GFJ$!tVS`oE5VhiH6s?KhL>BFArZ@q;5hD_5dUOz!W!-u zUTz7`wgPa@jD@;e1_w21=W1|ATm>6m={GxKSvO11j`n{Xj@$p?t5R39Xk}Hqp5qXD zc3Vfkr+{P&3T>($8eX0uuDBNqvn8%}dPg2^A}74uBhKS^H)$}aJX{F9VtYGOx4CAh zGTw&1!W%BLiF6bxoP(ar!&A9&RtC%*ulV@)REKa7JnM12XM%oWj^ zOBrxgBIM&5q>~`wzr_ICja!gJ7)juI2>6LWbYPe-Cf7#A@PPxTN9~|lzqMixuB~vi zI@QWS{eWMWZqe_XNU~o>A&xmE$0D;`8qo+`b{F>&tw5YvO; z!-~U!fi$lh!g{m?ZjEsF9@eVLA;muNYjl)k9s3j^iVzc-Y%UW|-Gfh+%ARVpnR3|0 zK5_qj__V}PApFTuGyOzA7J%rA54DvvDj__v~zJ~8hoDE_-MzsErb4h=G8mJ9S;cgp8ogU65a|l7huE zGP17+=@d!8h=m6opV<8^Q*2gTsDpeIgR=VI3K?l{pfyz7Vt5Af@rK$QV%>*8F$tIU zo{ko+*l#}rpJ&aO zgLzRYm)dZ~O~V-v+fMubqS;QE9U}cJZKv&eG-Al4k{*$s(W7D65|SK7a=#uu&67h& z@;JI)k46k3$>-=B5UsZ-pBL`+{`M~}6|L6ai#1Sf4+X}1XmSpp-*yHyw?kqhD@@cb zs=yf-!0pXO?JaljnAx_ zitP`fTdV^kmOt3*|42gfs&cgri{@p7_5-wXNR8X;H-U^Y@rfMv$LIXYksdksi#WMs z#;)%Pz2k0O2G-b+MpseN<~3C;>@(Cfg?e zt4E`$leA}W^cp=HF@(g;(YGO*rCr)!&A zcjra*Na#dVG1vsHM*a`aZ33wFSHskgk^TqU0UAL133v3YM( z!E$Rw)#8iA!Iiju0NocX_rJ%(T@K%-a8rt2tyYC=!=3~1S8R?!ga~3W=XAJcu&;`e zPc|kedUKn{jJM$86KxPi=Lt%%AF-pK=W1;3a(KmczvX)DD4~&yDYo)M(BSuY+Ps(! z`Gbze+yThK76~bVG@^*%%Tw_U?-QToU$6EEjDYVgwP!|(FFWC%1Y}-u*LzgQ&{YBJ z93I4A&G-AX+Wbh(W#9RWk;EtF$0vc}LIM1R{G~kp3ysxgx6R3oTiH^}S4`{Ahom(k znIi7t5|D~4vD92nW{6k31QEo%TbX$8&j|P|WQ>$UwTNf%A+$AvI@G`^V69i2dUrfS zAx@|{nHlj@&5zY_M?YekI0yOB9tNDwFeXNNTJN`EeiG|-hZm2cc{`hZy>m=%SKSA6 zmY_vgb1nCHfrVChcP{+boFg&ck(4PKG_7b@?dz@Kfw|k8{AQY0)c*G=2L}wauP^<+ z<$VVSqAl;c1`JFK0(Dj7R?8+g0@#sou>E!#&7%KwN1m%kU=t0Azxq@A?T=72A#ZvV zfgTyioCfemLBI zpn88S*Pq`z1uh}~_&C0V|M(Ps#Y@yk$hIu_s-_nAl8wXy5bj_mEAm??MV}Z-5hkn; z?-Bc1OS(hHt+N&l_6aZAH53Ad)@>D{L_y+;YK&#>Anf8pbiY1vJ~e%gAhP>|#D2NE zLR(#fIwMyeJ#r{~*Rw>)9YhJCq3YOytPUwpP*m=&6`w6GP#OrKvXYWkgqjCd+1D@q zK6h`^(&(V$^e{KMTK?r2^j^V;`5(!39c#KcD zXh|?OjEY|($;HjkGfr&>F$^wOtBuZFSVe%$H`q&IY`5hsYA6Ep#`HCuLK!iZ5x~ON zpCw|^7=ZHM8()5F-1yg~7N7ba&ULCRhXv@JT#hG@E6Q;WzH%hzc?^+ExlN-ywABg1 zsn4bk9?NpXlxL940M~*DrZoXhBbA?JN{iBH^O#L_$C_`$)sjIo!g!>}N2+{SXu-cQqA zGULDmMP9u0+#4X{;+huP)yDE6>;=n1v<5$*TH^PKKsbs3T`|{v1HzoZlFr+<53^sRX2alZ{z)pqKK>zk2 zG20wGmQ#bR6&D4DB9;)O>7SZbQHtQV=EiBBL4hlpUJZV5VengbV6<8Vm;+j3lhs2N z)a|B^Y6SIQ-S*(OX9ot#6x4C4^rQt&Zx2!xo4bc1d!pwY%9N@b%UX@}95~4{Xka5H z8rVprH#VB^YhORbb-1NJCJo>3{~S$gz4k$P)pt}O$c3KtPdPQb%1f-nF4sm1gv%^2 zV8UfqI3mX!j^cBK%N$KU=j`_2uL!2G%()T!e@!zEn}ao}?dHpA&IVgX4{CRHk^n=) zR95AFmK&|x#PWw}GOQBVu=eP%-+mLYD0Or!r>T*|su9!&-~WQjn;KbWMkIuVBhC(_ z@oh!VSo2rCiIj_IQvibaj^H-)(~kVc-FkfEZY@54)gC=|)gCSOnIZYB-ipP)rN^h{ zuX;Nc|F#|J9sv&`X_$v8xGkw z?6PmzY2Wa6>PvMPL_zWg&s%}}x8`9(9dKD00iqcJo&cxcRsY1VeM1X_e~HtksXHb3 z>=`Ad^aVd6b5y)Be)4uoe;PBRj4}^7l59m#39j7c{9BA)7@9OgNh6@# zU1J_1mQ^htqim)?WF_%y73O0^-A7SWf8A%ak^0EHXM9%o5m^d#+vq)OTWS~Wr2N7h zc)dKlhH5~R-VQrwB?ZeWyx|6FufkGK27p6mf;kh%;u|8HsTP!}%~%?3Ift@1pL4*? z3+GSO8V8P|PtVdksHC0^HHSjR_4P{1Az9Ru}wJ+EQTkVvFC` zkp?n}B5S(%i?+Wj_FZWpo4Ii%3A?hA4B9#2hYlifxPi(OUP+RV{Wt%GZHMA-uomd1 zZQ71w+5Zs+{M<0foNS;*TLPC#q{4>DAD)Y-^(AZTns8ig8IGW~iT>Ox9>Y1b+`WF2$xSyl=XWr3 z=uJF%TTj8fzK-b0;L{*{1PeBoyG*R^(x(fKVG5U&<2Vz#!i8zjXSj|Ri_Xd#k{@qX zx!8Rt;jk4Pr*lcwja)#bf!YsX91;eLwJSNj(m-Ml5BBt_OxzDx8ATY{NT4$%28aw2 z;(~kpUVi!Iuw!08`68R?JQY97aOp)wN0Xt(d=EHc4b%K4t7P3endNY1Mlih%y{=uJ>djN(!DPcFO)Z!E>vEmveD6x&?POn{xM7 zg&*(~0V@0=wM=p8GSC;HAZf%EtP#HiGo;{Qo)pqcLkM`^KVzpVcrS|}W|hHgr$O+r zflIlE1<6+~X0z(EVYE8HCl0NUwXvdy;6DZ5<~bwN~o-$&d?yh z_fVJURhWJfFE?7-UbJUr1%1%b_%$>Xt3-$#N%BS#<1(Dcf#jD%GiQhEJ=w4}!Vi)% z3_r-aj5*e^f;17eG;y9>!&Y7nuV6*|DK@A;GSedyENHZz1leSw6Z|J8tl)(8C3MY&T-rqSUE$uAt9*dbnZTitkxHAb`mLwo$=t*EUPsMjkZlXUbXx7(r zH`3&==mdM>^aY}@8%m!SkkzmDQ!jY(@EOy;`*{RYKLV5lFUOfrCjt@d+EY5Rj*tyN zGQ~Ck=CF+$rb5lpr9*?Y7Wd3RT6?j@4bLj(TfR{Km#iC@^Nz>_v$S@VH(EZhrTzob z>sGpGgLc+GB6pJk9B*SN9VgGt`Sb<(lPvBU_;fMf@=Z7AYFhDGposPi)wOpH1L>5> zn@VTatMSOO`ABJRDy8{CKB1I;kmT6WH27;0VjP}J_u{xU9j>P*P7kumLo0Tdi?6by zQ7>-2F9g5npBT2C6rqE@B9DQYy2wnxS6tHFP)(9n8GA2pZIm zSE(gN>(pXDK+K-%L9S5AJ)n|{U3GQaNMIPj8;QkLPU!6)lRSqpckv+r=Y@x_&0(*o zwoUZJdED3?9a$}*ZCDFXPDnk#Tryk|gEmbHDb}6NLW~13Xwrpfu4vMD`G4Gf34ByV z*6;141D&Ly1B4JINYLO0It)Q40@1J-a75??NKj-^nHbR-5j!Y~(6N)yNfU$-agR8| zj5scX8v#_v0!cuYBrLMH1aP@+aKsG|ki7pnb+_(xIteoGd+&o^rSGk?)H$b4ovK^6 zs;)jm%%k^juX|IB-4n+bmr#w1p*5}lFCJB9&!m@fiL}OPGlGvfw-Vu38p0&AKc8H@ zp#~=6NxMvW>!V~w3%b#Z?DAtM4>lF2>r`T9K{;q=bR;~lU^JR9Z9l&fUgGGEKRH*U zm>1|}+Yb3D%&RqCgp2<4)(YP@$N00cGcFdPFUL;~hK=i@e*Pnd&is5RM~|XOPru1W z(SDs92t~pdx-lEiL~<35>(eE;oFwQ>5?l|~5txK)yv9?YHEp%gH(sEQe6dWPTfUvz zJF1u3dpFoe44j~RH+&C=yJvGXkEN)5!BGGUR3H^X|6F_&k@Qd>1Q^wtY4SWaAXzg3 zgP*x@)EfbmI!xYHK{gJ1({2P!B_8}{F zBPtPF6DU1(I)=j5665;Tl(T6Hzf@8s6Tf(0l)C~V%!%{Vk-yPy!VAz=b1P^y*bs)z z{-!GT1>i`P;@4#8kw`xUD{NpH{Cd1+-#ukSn~_=ku4M%-Y->`_cw*cI)6vv%Z7y6s z16S?>TJ}_&8iU2+wZ-cnp&Q!o66KEWNb#pW=O?^_%&lTEo+S}yuW_+BcwaD?J<1X5 zsUvxNwIuIq69iIZ=49nWt#$MOdtmNb~M-_|{nxvH1qe z4G`XYQXV=T%7d>p$pf)~Vqlqf7v$rWT2!Vak9h#^=Fkbz5-$Aksv&z-UcyK~P4d)A z>eH;(y-${zGphK(@WlG0j1$FUyV#ahq-B7jfANH_{nE4J$J3MSO|!8)N%?A6|8#i? zQDYm*rZ~l|na%7EKo)J6e<&y3W>N!7T6gPr3G&^vVgg7AMCdBFh(Ls{l3!Bz>vbED z@tR?gu#Yyjq_gzMhUkaheGsF&FU2B3@@>nBDyn}9P}bb9*a4vad@_I)-=WzL9~^3O z%<=4?h?OTI)($1K9Iua$@>KPupoK>bM67Xw!$eON2d#i%&JeFaA1Go`HpQ$m|CrTc zd%-sy(O#}X&7!?ritbCa7kE~!?pfG*H{SRHEJ64W77$>UG|g%uMI-e`qP0h~%PxMV z2_}xJ!onSsJmn%jk1;x@hr0G5iIy!4<+Tqr7$(Eb2f?J)v<&(8sKN|+NCo}vUPhIR z10F55JVa@{UJKGw$#g7(vnpVDJHzgVOcW##<>dD{XLA+o zh91d`{^uAN<8?EZtxAzw@c}%#DMLhv-0G=y9UkgAR({x=`&H;r57>_`&zABA^wH9BB3|ro1AoXSrt!1v$@V_k`bD ze8>KoblPFmoG@M?D)bPg)rFFa)iU92L98^*(TkL!anod4O0+}%2|rVKVGo-C zo;pP?P$=VKqB&j2Eg7c3xj3@IgZ%(hI!DDPI(Fz+&fwRv77R#+RyUCQ^KVQY89 z3Kv4V=Q!JLr?va`y3y(G^>nMH_gsD3LdA=W+edJDF^PPpFewqEaR51eY?`W5E= zkV5yw;xX5UV>x34!XwuA4JeMj+EZCIa&S2Jht2leVn3~%`zx6d^z<_k3sEk_2AZu8 zb1RO6-O@sThET|sA z-7Y`$DJ|E;{+-Y1X#giJ!WInf9v_aTNg$s>@7?r9s`c%nS#AWA<5Rj#d}aWa_+xF&UZi!Vf4O zScd#e(@- zjm93ip(I!6Y~CaVF_Yvth(!4|mj#-kjt61el3o6CJu00RhB{C8%jri5puw&grjcV+ znnsjB5w_U;eRdK8N8>=}X~e?Yk*&~RKQPn0tI_Nr8Z4&7c9v`klXiJDhhB?9fxTW# z@wi4oM-P!?99kh>Hmwr2%inL}sOcx%%^KO0x^Q+j)@m#^PM5cCQ;a1~uOS9>%C9Y- zP9E9_0_nPW38Np1CPhceO+8RwxVIJ1X_gQ=g_gL=*^n1EV_=>k)erUH4{?r^>w%2i z(KyJdAeGQzdAuRSS2ttW1xCuNfq@-%qp|XLC?U*CNSP=KMbloa7ky}=;y+s4j%PAB9*w?XOH-Xt&KF2+3MnC2K|djQ$|JYm68 zG%ZW|-Z7INWc%TdEx!;|i#5u0h)h&wQ+*aTI@wD1VOcDn3!D43gtx-VY3^iI%W-jjTqP#)o{j6v@-3M()q@RMG$%5DZs5A>(oOQw-61LTshK z;E4%y1x>Yt9QjKYtv@8>Eci*3xWtte^0K(|NZes8?otvLqZ}65iX;BgaPk-*@Ye-d zDdyr#ye)=gl8`(t@?*R_!qLT3slNnsR>bN_hhH_L0-4aJO;jivV`MI!x%>1szV;T| zydnQY$4J)VBh~29Y;@0e#p6uaOhjUTNd}MHZd%W#yh~y5XT72>g~Xy6@X`1G=*bxn?}jTO`bFi2ZbRnaqh6OA_1a5PRk* zsp@emTB?4W%C*3VKfdOv;G&L$zX>DK>JEhGK>r$cANQ}y(od9c2`!`lybbNa7+Q5} z$$n-s^*G@(_+cI;m&*|f9Ie!hEp>pW$=i&~|%yG(d_L7tRs)l?#r@`KDZ@P@Q-V|De=4Zk34xzW&40U_K znP4E#n5EeK$#4Jh*o>nan;KM9{?+k$pxBHEYrBV=@%?kP6vC%DE{kW;(pVUi!=*M` zvJLA|tjIMv;`|XY5VtV0JKCZ$Q|i~q&mWE1bXtjXLGAMNZ)v*Y#5J)vjoj1elTA~w zmAMOhk*<yuH`pL`Y!|asQ_t>VA$+uM>Rp5a0Xm zL$&+WOrPR=KT*Gbm*DxsH8|f-9HHD7=f+A_oW}@PU0+)@3`_qc=}c2Ke03OB_nK)g z=%}$tAg~m_^^B>b^gbx0jRSzTJ_UaoJ1G0HtJcK>(AZJg&tHg{I2?zYM0_y`g}-K% z?-#jM^aSQ=H05kT;}xa6d^wEkI%z^VIb)00#XjCqDxTDPgB?Yzn~p!8>h(?^{;Qe) zfI>`hf1yb+^!Hud zhe+xb8Nigh5ma+(@Y)M;C-+o`CajBjPqVV_uYUEp1O={Nfj{S~KAr2LNdia5s$9M> z`VvXuOx}hw{;`h_(@c0uL?EJ>BVOFUtAS^fik9vMMqY)ZmzZx-=F_ps2=6Gv5#Ox{ zL|C!0mx4mx)3KQ6&fw1`@B|MvLyjz-+6*ArJ$VQl;dnQtL=^J>F!(=&Tt9t83YN)| z|HF1twdC9++Jok?hbw9R08em4g}oZI_z2^@=oFxDoQ~GBVKx3F);ESL-tTGhJR1ep zp$7_|p(@kvVyRugU-8#0ks9o|1ZFNV>QyIt5reDva~*ONcg+d2IPOeYd{~IibAjPbc92|$P34E9ID#kw zep9%L?2b4ATc9$9Dz9J3R#;^w(8K1!)ugfxgPx=%!7PQVNiQ7+Wk?l*SqoQ_@S4CB zaNOt+qcJ1xI<LI0v2+Kju8jG+;l?!d;!tR ztB}D|)g4x%`<82N!yGj8a$yg10ke&(x<~O0{;v5#7=vIH?gy#TUJc_93{R`D_d4uIcC+>lzoR1Z{IlswP zS_@Og=FpncYj;e|wa(V0uDZl!91hDp@+_%d8_;?h=d zx8jV5gszjl*%1qdQC@N!RD8Js{jZ{Dw6C7Cz?5`M{1#f08TbIOIDZ94Dhdu&73`$6 z_<(vojaeZdJqwVb>luA6dQzmZ@jEjTm-SpA^h{2GWoY&qavaNI6wb?u>Eet%YGj_yon6m4(F@=Dt`Sx*M2|7LOmZnX+OBGXVCWR z`gK9`ASEjMF1@lbv=ddG!Yhn)}eHxUc8r2(bd;43Q)}Fks}|&3O(Hlzp?c~aJ-fg-L=+3-5{L&vbNNF zyurJt;~J#D&AYomJsE3G(1QBWUhbinfhwDccrw6XX7 zJ(j`x=ogO+y*`8L*XGu%1*+7xsOW@>t$1(?bvi=nj)$n-u~j@z2kejkfTO&8G`|!X z=SA~7pk)A0=BI1n%e~kRt;DbuN>zKBXzV;4ckIo-t-gn0MVpV-1CY^1t%F1{gFhS8 z9NCuYE>qOhJ(~8KpQ}ILfk%8F{p`qSqke7nXG5SSkJbaVGDXtfczqt@^Bv!?{(5}2 zBSY8!H^yfzCifP8JfejPj>Hs2l=9d`4}$SZ9V^c}hG)UJ#^2`84|x6Rdpa_7ea~0? zQbM%Qx0QC=#;3tH2IwWSpMndJ(MAQ^)?l^hd~=Z6j5pM#Q>jgDzV+v`q8M^-e>*DdS z&;06p05Wua|0m+{bfqCTT9n6wB|fq1w>=-EVO6Y;f2SbhH|i@UVtw8g-4*L)wdHF zy1xIFcpdm@*f;}_qB!{ZpU-*uV?TYDAmjY&JIxrcTba+9t|eRm?` zyz8rX$iehAhO9C*WSwVykJbC>`#CbsyS|@8dg0MR-{wu&$D=J6IHuP$-smHsHL;@`g^uc~Q~|Z1k!>f#YF9yVKga>W9v50s2nDd@omHx4Whf{sXQ}*36@c}G zSi~x-lFntoJk=P;Hx21dq}P>Hgx`ScFaI!@w{+<1FR|;xV$!#KbQSRCr+th4Cs?EH zsoVI$?Kt`E*t$+oD)Hct|ID#@w#wIIgu&l%hEN+{_eF4gzVQXWob4MI`Q^O7ah`7u zvwZ~vagFVL0T2p|2)FwppxiNjIomf5^~-sGV}IWqF86ah;A-W@`67U=)h}oJ#xq#p zYOsmp{f);&j@4+TB>05J_KN@rrFb!=A?yo)a2zv-8UmftheG*-U1~*yVZnil;5oLD z&iWDv_l2To3XdTWwBkoYxabxII(#c@Ms%%-sz?$ zXY$1$$69>cn{f=CGx-wjK7sEOw0j5N_toxapv5?oFV*fhQ4883e~So;HOwK|`_W8j z7Z!z`va_y}5w?Y^X$^L-D3FX_clmpxC3*T&A(ER_@^qrp%hR$`AfjBj{%lkBEZk@J zr`t#9mUPLEquYCN>*-D*)3qs<4$_Mzb-vun+eq=53@ag}G7?2p*CvaGRHh-FnF6Ff zKmyp6Od?5Ze?p!kZ0#}p*s~i5K@teg`8T)_mw=k-3 zv{^N4Ak~o~7Y}#3gT^?Usnvlg?FSEZBSw}caW~@e$^(AMOVF*Nh zCPRMJ_$k@6Lp3V<3nkkVgMGEMK{h1&E0KkLgS;6w@}sou|M+EXPs{$sm=%c~&z_L9 zY}yZ^?7yU}wCvHOR(&bdg6qRAvwt>_okU^OX$ZBrynT8W)Z#2`?94tbu%H%aX&QuN z|775Yox71c)3VR{WkG)bEXaRK!GewuH7+e%B2h1csJvNS?u9D|JZ;KUI`4&o4bFSn zbQPUDMscXJI*c0!qUTJ>n|cQO4z?la%3rM^GCGhj3RqJogXjsJ=#gKBNz0IG5rw3X z;Qve}Q%HzOSzLo3-uQz9V(@T>W3FhwC_3w3qt+<^I5oCSLcqtfLt$i>&!Vqti9qnSmClb6+!6J65_%~% zQK$9@{TPM`tuU70C(J+^vKa&jz|RJh&}st`7~4u=2jXp%eobnGtrVjBm&y2KJ_T0p zBawi@el0-3GeB9Tshz2oY-=)b8XPJLJEe?VXQ|-bUJqbQGzF zG+Y{uG#BX^qz{q4MT#^HmxdwTp``oqn~U^3(jLIC!0%3^Pmxq74>Vpn9=0zdS2EEK zrVsEjT!daPzI+?C0asE^RQNRntq$9bzw{5E)brTKG}UAGVD!2U$k-4&e-yr5ll704 z-n|zS93LBvLRRMAi9}v`DYj{KqDwl(9N`JuwUQ}7&F-Ac;i)4=3O0PDAx%W6E30vM z9dfcv*D#Thl+oJ|g!UBBY(TwcBOpWo#%N3%FH&Uf0H$By;1b9> zKx4WcP@G5-n;na+G%WouXao*=Od_ru$`# zY4t8+_8-y7MRC~;0Hw=w70_Jb4WjHCrnpn#eWzOFYGkL$H!ImUBb$nW$vxXWKSUnO zm}!v*33;CZrngrhgl+=CNeE|p1>o?*FRXDkAsiG4$52F3oo72wFi<(2d!6S}%JfH$X0k~fPBqC!6nWRFa08JCn zFCJBy4pyP$1&IP$1E@Dn0c0Y-r^tVusFZY+k1NEFQ#QF& zG_up=dzI{aiKl=4P7plLJOWvgn2UE;dc+XXfyq$}@Q^~#) z+07i`W+CrLV0s4yLby^O^e2RFfe^w4LNp=#a6w>4=p-M(R!rFC%)`Li1}v?iZ)E^C z^o_XWhW-Vxg!TTZqEbVDN${v49&Qyt4ZT1BUMDhcl=rJpYUp@8qN0~*Ow$x7wdb1! z&_O&08S)cF{v?fMoBW;JOlu@a|`b9C5MYd?SG8yX6?L8 z&>ee7)#6nmrs~~?EW7-iLi`+MQ#&t1cAD%`vR%Z}x1EQ}_X(b>fa#qW2;pXdu!Il> z1wyz|AUsS6-2_5_c5W6}(+TTaoSw`&kH%fPe59Aq`3SPL*1a1$HDROvzz`MvArW!# zLROmmrb6_lN<_{1B|&s@j%pw`Lo4mJHCxiM_i5P=s6^DtX9}VZ2+9p|yb(G^Kvw|j zy+#F4J5CgUJdJ4_pj;XEAcM62vgm7~pgkb{V z146h`AT+D!PI6CywUV&Rz|z`r2m`nspTPb`ZpVv&C5--AcLkN&@yCEe)>*`(Oa)Lo z-XH)Ih>Y9uD=L)Q@d^P=(wG)9beC;SdAdD2mblGU@Tp}#Akfb^RA#psfD;6;fq?84 z$!bZ|Q(r5fn*jCp27tZ!b=;-P-Fpge?vCtcE%+?9G(xduT9IGl2wbk%dC0QM`z{p3 z`zV_#b_TN3mu9NDPY09OBpU_1us-o*mT*o}tEc>-Y&A^bTI!d(I(ju6JQP)=t# zSzwt7>r!B`;zu7O#p4tq(gWe$k zFAzD`cc}`cmb+R&of`9JjZpfY1DMVrrjHr{a|K|u#`I1VO6_{GfcDpzjs#Q$9%QA- z*IXc~=o)0V)UHp?rpk zcA8wFWLF^DuU&VQU&AI!aw%YXmo-PQ$VCES9w9s!2;m-qFoO`%1wsH18zHd95LSO+ zY3=$-25`IXjZ1FVgMcOKyMu~K?YaqXAs}lk@sPVHJg8lNB>-n0Q0sZ83Z-^kBcKfg z<+k{i0;N{`ngDJB(7Vi#|D?!YrLml60L~G>MH<`Fp*1F>bU5Zv@I1y9-d^xi0@~Id>d@4$*-Y8_J;iO5CeFWKl)f*{q!=6c) z?Bp!S@?LXw0wEL$gc?G4P#`p`-p=w2fwh{jZUL57y*D#}t2YIgT)oc# zOVq?=Dk?p1#|s|wh(~yHQKIFhMp9;GG;n{yB_?&!vS$!4ZrcZKhL*pZQL{&DC4Hzu zspYQ`(Ee1?OGdzp0uZG!EighC2U+<*(-sWCdV+Q)f>Z{ck!2%vfTjL<ug?OqCmwM1ZDu3^m$gf&xOMQK>$2`gYPbAv!V z`4?E|a$spraw!AYNqXXvoumO+!bw6@REhzov1t;bZz3LF;AJuMpcrsi09Fwh`@=^n zlw!ap0bQgqeM5m#40uHVXA#dOhWsZ){sfKX!z#-VP|Qc{sUyE$)73N zpCQ{X2w3E5?8AhlD}m|7SyBE7;qpHP!XiR=A`n8pKyVPkUj#ycATUi}-A-7efu*^6 zl2STE~3fQ z08=ZX7NB(b4F&WDgHQyG7fSG=9EN%q7@~-UDwLvzQ$U{q)O(K+aJK-=BQkb9yAgVm zfKJz#4pgBOHTntYNMafd0Q*UQ+@;GAETY95fox4rnzJ)RjVNHI$(YXP(9jS;dMZ)l zr+di+n-$PzfY@I?K{lR$INRcVld>slY(jRr{Irt&G_rkMlcI(bt94+V*MTY2yeAOW zZ31hVhBYD()*yj3Ps8d(SOKF(xImo&RPPU1m7qn9V_%Xy95uegB}a`h#E?7rZ7M27 zjm?ajJ%D(;sRAf!yeLFh1@z=hmFYtYl*j)9_z8gC+YI@)iu^JnVs99( zvZSanL_k++EE7~HMU7qp>L#8Y0N|>bg}Ze5OlQ&X&shAbhN8xo*qVu|nWUAu16Uk2 zQjlerH!8#%DVs)ymm@n(UZrH?l)2_XVX5F51x)WFfe>a1gp>CG;nwB|5%M^J&_D=D z0wF-uxI$pn5LQ=UX|C=UHC_h-;$J7>>OXfhH0dP(rOO8t&;bT1QR5?Q;)G=!zz}}% zu90vO6TYkvzN`{bEcmM+9I6pMszNCiI0Q5vQ128YV6p(1iHvK1q!F4dpmMe<&7~@o zVnJ^K-3F-F0szOo5cbL)*QjCgMca2oDv9YtiX!Xu>KGT>vDl**08z| zR=`;BD_)?Z*rRvDLSNy7Pg*Saf&m;0_T!Rc!ERuQIxkaEDHf~~Jk}DAzo`I<1uF#L z1tR0BD^#Hr3mz9xr^fVN6-u--1at;5y+r{~kQgKKM{7K=%fq?=+uP&KEqN0jBpa%@M-o83Msc2)6`67$Fd{38BA02oMW;2`oEdbpV#; z>VC0c5D@ILH(bO5FIHk{-FqxR>GBQ*w1YuPEZF!tTjtE4RKHkdBy2!-y8M(v_>@XW zv7kT@Zqf+vSD_ROvITS%px!hiV4MIfA~JTUBqQ|q0y;}$iU|03Fri3dIpOe zxb}zQE?xe?B5MB!WNQZUiv{t(Op|LE)9R&9wrR1z43J%ZLjk=(yvYlW&LE2A3h(7= zk-L$dE-z5B7a-fm;b>ft{TZ9}17Hd@(*j`)7g#GbtbT#8;sn+r4J(YW0>*;xKjmT_ zK=mHLyKpTQ>|+4Og6+8ESa3TrP@G0BP9dk5kRnMIP?b0GBBrN`3COa`FDb+?Q8szQP-LgcZYA4I zJbhzAr2K&3nE=ejDSps!dAxvH33@{_=rscR)183!0W?4;=qgY?0SY9-mxWJBO#fTj`BaX}Ig0j$5lejUK@VWUqo4cKKn5fZHV3rg-D`aZ%g}&uM%i7wq-&eabGn zC8ntEc)jzmsqAo=Z9~0l>xgvBD|>3|z9~N(cB0;OINr7OwsbnGJw(sAi8Dg=jFHFd zILoYN;rmpsL-DRHV<`|gqFq~u0}f`nTXB-HRQ^p^Bl0FOO_)mK+Ima5+@ZW7>;#sx z#;3b#GVE!jRrWGg@<}r*nc~`Xxd-3-!_lj4(9c7*rS+TqIbmVmPQtu4&qRDP6_Ykt z1~?JRv1;%E)ik=J`5QQJe6}0qrprA=xtF7k4dueBl}(=0la>8lE!o$z2nRAt_yp$^ ztlis%Y7z_n(DiwmYC?xgN03bB;ZhvZV5CV%4bsS?SHBy}7v^*~BOx)tdWq!mczNS`BxS%yoOAPqyh z4e4Q|E1OLV6WxH`2FAkr7xogft9kD$=7!%aC3}szZ{Invmin zfrE4>k{jtIqz{pHBmICBZXGUNhLnOd6)6X4JyIQ#j1=B!xO64b%}5U*y@2!{(k`U$ zkwQD845VbF45U9JJ&E)$q;jOMkt{aIiZl)>3n>rjA4ru*hmcMo#YPR6u0^^9>90ty zB9$Q>LJH{uTOr+qD>cmm`fw zx)13kqz{qyBK?HaHF~(z4{12kLZlL;_mB=EnYzP9NVgz8jIh$zC;R%fenzZ zL$V{yK`KUCiL@E%E2NG+hD%o=%|=>+vVP4y1>XK1AA$)QHsO0{9`) z6eJhYn@H72Um}HG2)&V#kTQ_&M=C&i9jOxO0McosxSpsVq`Qz-AypwALTW;ajf35h zCLsM8DGzB2QUlTnq+Y#-OCyl(L3#pdJ<=|u?~!a5!KO$zBHfAfDAHe%)*|gh`UDeaIY`eVRUv(j^ea-& zi-$`?k#0qrgY*Q_KasW}9YH#U6nhEuLz;l3uC1frYSU0GebZ0r_mn4Ysg@|OaI^($ z(yd6Hk)n{gB1OAL$GAuLaF334kG`NP#ccfcEAi96Z$dmA_`XTsj?_(=mCY_`wArC( zY|Qa;OHpdPV_eZxYtb&}5nF;Sq_Swg^N1;=vg{l4(C|4O%^ebK&I(h})cCSSbI2~| zsqi_G&WaAs!#3v@Q)8&}&{_9btnJ=PYhw?YBWu8}F`+2Kn&~=(FSVYut*H;)8M+l~ zYtdKRUaAyTem{k_6thHuhZC)o^UL^`0 zZ(9T9HYeD4xn63#qNQ!k?Fn6q>YyqVE%#bODoLe7HiOQ#(y8(I(quFg2NCODbbCTq zHF?tAHc!BTtb*@q2P|V_#e8U*cU2CR^#A&e#MXh4ZZu71LncsZ;PGsM5A(SbY32Ytb<4_@Y~5M16$RJC8gTu`9tDQR_~NQ9c|( z&W3+ko?-D>eTX0?!&dr$HOsR%3uPochEgJGv+|GImZ5S($_5fC4!|!O7N0lFD)=Up zh15sXqQsblWM++;rS;UMsqtC)sa8)dBrpG_Gqi;K7^XyQEy{?=Dwl0#4IQ0_lOrlZ zwj_KQQ3E#=XYrFfM89TiJQmkl`?1Ctz_2GBnio;$JbZ?}Oho1g*%DEQZ{)oQ;ZSsj z#(~QRJ#4Dc3yTT*ED!}_pqJlSqd&Lub^3EFKk7G@uhX}ueDa?G?e(AEx7~kWUj!QX zfnJgBR5Y{4BDTUmeSLxap(u_0GCs>wMV5zg`^3W8H(=EOM5Bd~f2G0u79Ecy-i)R@Sc#;cU9k4#$Dg~t&Y zwjlWR!%F!I{CT!)U}{W)X+SDMWvVr?mO7B~OKOi-p#PwnM1Y_Ugd4P{yj<=`Q3Cx( zWk@}u1hw%1-N!b3FI99NnYO$Q=ro`bVs;UFGwbm>#EAsk_$$lNvBY1A0Gwe(mqFnD zqGz~r7rFuLM#!)h?WOEbNqNfaM0p7Rp8e&G)CX`rcQ6sokqMof@X^=K;dA(!{&b>@ zPT_MbbRFTWXhLU8#)(qGlR}TfGl<4vRM-rnjxL zKzqz`5kVUorQ*=w-_$Ptxgcn2dja5GR9p5 z(H4fGEr^a60WNsQOTiHT(ug3zge_fgk%~fdLNfz|ltthhPB25uq8P?t==W7_!{ReC z;dZJujK+vO5zHLZ5P(&C=;A@Jtn$NLF$4EuXFOuefLmi~<%o(Pf>mnrfYt^LZEMov zscN!351?UF-5@6>tL{Hpk;j6`WDrRhPWfAu7EfcNJP1)4a&X|SF~@72M?xUj#T9Uu z$(8U2D-DF;6qoGH%CCp4=wi}hFw(7Z9u7hIS%t&m_3=tGei0RdA9G{>3dk=qAUEKz zLFE;jQ;MzSFy&R)N$Wb<;i2hG3HeK|rClZ?6D+nhH(iau5L!-~(L_et)pasuRp?oS z6Y7i83_}nRpQ2$`<1gl0u0|;fk#0arN4iV7ci@*y$nx>mb1aYb0Y3b&I6B=qukJFb zIJ(Z!!THEg$tok2L6xJOz`Gg;f^w)h(2x{)%1Siz(Mt&foYnNriknwG!LY@V&L~1vGaH z6Dd2D9w4gaOjSXj8pS8+3i*~l)TS8JlS>HHvzYrzc(jP5eM~^)Y?`fFN^s2I&PXtW z2T=Sm)S3~$T)(zbro!H~X2^)Mu`?y!pYA+zM*ekth!jz2v@hTQ%rps9}Y-9?GnF2Oo}DCwG}F$uBQ8VY@rQCXC}^XlEXJCNhB7Cvi-4DM$qXp(S!6;b!& zPP>d|fBEVLp7-U;OuEG5D&Y6iCB{D{_fl$ObQi{V)XeCv1Ik230uZRVxpS$d`6|ri z^)Dr$f=ySdSeK?AK$Pdg)@CNIkxjmvQr2fzs{*eMpxq^UF+z5 zhU5qxSXNoYm8iExLhyyp1#U1n)o?KQqs`!K4-v1)VRABG1UU2UrCp2^t66- z8R{N(IoY_QJFUNa*j0$Ss_FO_`;fOb6)v5Qf(n<;z~8r<+)JrVxP{9vC6{+EC1+lb zcCIvZcP@Rh-JP4wfA8VHGx_hm_?uPDK97yyg-acDU$}G*|FFFj$9Ct=V*+|F<<6bY ze;4pyC;!dmzmM}@7yc?{!ihYd@0}Z{NYrZy@y&FE+e+W0f*L~-zs30i_5^Z+lXc(a zo<0V&oGWsFr9*gf`VcG@Ck51FexJ@Ku*cC2Hkx+Cy!*hi$(6;UnuhGl>8{{+qOboE zer;ZvgDT7-6AlzXA^c3V+yPrrNG(5s;nzplm% z=Q=u(K+3s1D|a0gbWF)}Hkz4usbCt0+GiqL(a;J`q!C7Iu;TT*gJV(gNa#uy8egLN^a7 zpB+(EKtPjg^W~lb30Ffl&yMJ~xsb0LBdYlq0!lA0!nb)nou0wp6JPeLdHDrg^sGpJ z5Ib25Irs0Bv*3z(795GNx@zBpz4OZ!^qgnT-|}F0PbVi})nQBU7ez?&o!2!r)qQKr zTa3H$nd*7}SuPe2AAjdx*SDsuAqDY3nH^5fHk7>2R=R;ya5WJY84;hF{Vt^O0!%HH zE>6IG@jTnvhdKgyF`?n}^`*;`a8A${ucLgB6jq2m7gu-tehz425RqUEmZ|W>B7}yAxSL0lAJV3 zQdB}=!Fk%`h%8!8jh2MC;w{tQ{W*B%U4A`shEzC025!-z$S+8t{F9XL+%O#1Qciag zGs?Yq1n#N}ep00O@Kt`9dof`-!f~`sA!j)^5TYsPLe~bum2$d}3}I9{q#sGJ{BLdf z^UvZ8g2_{-=zR`6@ghK-Z?R_yI@#epR13fA*nZHzr zrfJZ-0aap5V*PbX$-i>$Nm@#kl0%1abawN#d+9eQW3|bWn+!j~HLzTj0QPFB3S%F00x^rFehFno6di z@tGTw9W?N#47!iUz4{D5_ZGuFCQi%}4kGv^=Pm?LykO5gBsKAoCVk*Q*LZ4k4?F4p zlr#eOef6V1@Xk?kbkF?-?-udEp`7*cSpiP03oRNIO9SF4yf?7o^X}F(yu1dt^u`4! zJ!+^EN2f)j^Vxx-Fh)nHz+Z>uM3vN#BH;_knX#AwvNqx^epx4?Q+PiP-prBcbP>mR z_WFo8ln-aYNdhe3)yXX1Wz;#?GsIB>&w`O_;TV%7S!P;1JLUb@nU0^Xk<=GdSbfI> z;;zoT*gX6M}g)Jo^}lXAjb)p+B9_wiYU zgXv(oIQvX=kn%7zR&bv-B>;cLd-!`JG(_+w9?ZlWnW*B&200h}fFrslL48-gYJ~0b zZfsLmbj`WQwr1Q}TPXr)<{6xeVvpRKCe$1+zcDLBawgB97@l*FGx8d>Bqz^ zu8ILk<4&a8o+@{h4@k3*&z9lV@|)XDc=y)dw&q}Q^kfVfC`L%oBd*x7M^e8B6Ad4W zvSS5;d;@luIp<#?!A)Xwy3x^juvS#M9iTxlR^v^W`5ah0W^xA{ak3q&P_`q69UyC0 zI_I;s=d-md$l4XKb{Aq{PoHT5gI#AZe#=coC3;Z43$mEVl8%Th*A0>_-+>W108v$= zevs&~w>lP2zGQLRA`gmQ8v?*F#yxU9^OatkXH5AzYG?(aL%j349CzaTi(ymz`0;3Y)-+q>c*pzt3dVR z9kP|Ad@K|m{uXJv=9V9AYjPiccQk!Ixr~nCvMpW)fcE_;PxrN_Ct*2@c^&;W)#jHu z#ycOwsO$n;={Q(vlw$VC3K%}Ca9k4NQt7xs09-3HRRM#jWk!#u!`{|n-xo^$4nDa< zejd@Kv4>H_d$9i<09u_3PZ@&uq_#yliu)AZDD^k-L(HlL?i(fd#Lyhecp!iID`FPh zYP0TEUubT{<1@Gw|0<_Gsyz&z2lrVYMGp`^)6{_m;mTZVaoQS+rkQD<0zR;H`63v85&>F$nwj{FX=8CcXd}QcQ{#yz~*wpJtLS@bS56C z-Z5;DddIM9)H{Y@3r@G2*)=eYQ) z8=rY9x#avOEQsLZ+<30(!`hXF^|$3`QsqoG*TX1nG=o2 zqDzxXsJZ4`xj6dD{%q-Wz ze^6n*^7D8#m!6r8GgNpAAd|`^%}8KxSTG*I&;ojx!1E$KbC}SM3poQ&%D_|OMf6k6 zkCAvp>`0G~DNVJg52DU0B1wJ*ua-9U7R{IN-k>3N)<@91dB&1L1l@A6IX?y? z1Jo^Lk%aM{9aROFQ+f29>oaxNfXpE^Sh>OvNABf=fF&PYsXQXdKTHUrTDcdo+_{0K zolH3cX-)?mo6Q0qVOBX^#W|<@t|!W=-s#w`t-o1O#v?Fz;=!a65-Fz-Ts;;SFz%K3 zncamY5%QYkv`UlYDWC~b1RF;V{^UFY6^I~oG1b-DC=}~D)UjVVddX_W3`I^Mci(b4 zLP%0c2Jjr6pvMRdNZov!R5DS`{0zOjn{Sg!CQ#-Dz`Ov5tGM}=<|?Rsm{dwCq36q- z%q)+X(j2m!o*W+x&$_OJ>e+F9RRJNGic^!<(d&p}abCH565d4M4TH;T%J~t@w|&Lq zoT!;yar18&2tRbbQc?+-Kj(L-O;Rx3JUfAEjxtU1*Mg`k6FtI2Qzv`-KzOwq)f&P0 z#DlPKQ9%?4kMCPIfqlv7p@k*X)fSde*I8I{5`SqTcScwzC`l8!g$2q(IIh^^3whR~ zu;dIANZ?yoV&=bA{LLz4_3;xU?nruf2|2vGgxuX-LX9!2nq%4_+)~YZy07^5k334E zUo@iRN#;2n*G@8{S#1ec< zrUuj^#oxq(eB>%W{}oQP$on3GFm%!@=eScXaussisp0OaHuuynRjJ)znyJz5sXeMv zV+O%(QZF#Mr^dQVXnMk3Lc?0vALADs^DWGc_FTtn2;;>HZ>i`l(~r(Ii`FTVp!y;c_-t$HjpVp zs|(0~XpSuB3J*8g#CkrD@Wl6?a?$Pp!xT++guQ2rG%GR15_zd4Z73};J?m3I=}4%q@Z zi&A4T8NgE`|M%q`rO8XeUPpI$jtykRLsbU*v8Yd`5z~D3|h7dWQdqryB6*=U3zS9S)Z> zqD@2iv`d7ZXkY1r?8;!CIxn6v0Z$snC(}HXEuR{_t@I;Wr(|{=;!*rB7{yaBiqm6P zPZ}=Kq(Btv{HAXl3-dLWyfL>Ai2$-V6 zVc0bf07@pp$ZeL2$c-basDLuid1?9VOAv$hclv0!7?VOGgW4xBUeq!aqr9$VC`Nf- z%TP!LYfKfASG5d<#DcX4Tne6b_D{rq0;ID@Ju|SU0O^lNe?nS-^jD-ekgAamAgw|b zs_9$Y_sJYC4MZA&Gy!Q7(jKHQkbXw$1pK~8*CLHVnuK%@(j!P7q!*A3-2?Z3o>WVw zUA~y6QFq86(M00>3#5(oX8)b0oOmoJ#=*fEUDL>m-T)Fo9bwYcu8rm_(|o+^PsRJn zv0Zt#q&N^f11r;0yJ8w|hx}*2i&8JZ%#+Rlz4n^a7)Pk9;X94bjRE+SE~hS)q<9E2 zVq{9UZY+jPjltYb!U-#N4OOWT$cvFD(C{-A1Kx~yEU(J2sJ&?J(cPe;@1S_T{}65> zy%X=;K)xtBrc@R1g>wT9RZKa(s|x5sg1q9{CMt}MYlmY|!Ht(WH&7Ha?f3fn5vf}u1m zXdx>-jR7j!Ie-4tws7leZYiHcj*#-E#_-n^_F{km>v_w$AX+X)IM^FfpQO&P|MF~#sD>-%l|R@8bkT3YW4D;02jGOGjgBu zp8>g2zJYS0q5Qq*6N2gQTfS`ILPv1RPd6j?DL+;#|33!GJs6`MPmPJ<3Ygf8gO36B zqBDg72%T%-D+8Zm@R7SWqxX?uIp~E2jv6S(8ztC@ zT9e=#17#h8pXvkY%^3KYU>7~r={{&I-vcgkw`Sx%yHFAz#H2T2b415Z~NAA*$-baGJf?inQ z83W}wqXawAu>|n}yPpJ31D}p0!4u8seI$s|B$#8M+>X$!`T(6L5k!EUI8)Q$1Jey$ z7J`dR-v{?4_bGn~$b|(m43xJR%HM&m)|Y`#6^!#OKgGbMBbEO|GjgBuqqOq(8Ys7O z=hI^BK8Ry6-KlXwq*})qy;K`UkP!S4gVZ?siUEI|p-G|<*%OSZ#qpFadK?`EDde3P z)1hmP!#kWFbZr0TP`vI%fXC+D2_RM4kAbR7aM^peD*LZEDAS#)$v&0@2rT<9#?)kA zxmB0lgZ@SC*0Su+fKdaUV9vcE#4fo1Qn$zE@u@*?sFk^KbbAcM=khcR@Y@7uEQ|6)|#=N~c1 zaR=m(y$4#9{x6^vmUkGa`URK%x>lv{;V1pwBtc-GKZ?0QqtC|~eLpUo{@E(hO$UB{%b*}_knB} z6E7;)b$Sq8jeL4@wvUQd&me=wb{V~kenY17xbPT4F{5S_jTvO%XE_@*S&i9_ z;BoICjM0it1AwH~)9ziZ=ro==YO!OJp`Id1rze>~5S>m0ucsd|e-T`#I>u;4r`v&~ zjf|V>TTyC0v((25ZyL0^2A!GwA#(_#Ro~z>)vHylPGi=h)hJ&8B(}flf#E){#|$=u{WHrfy>X!CKU1ZPDp%JXxzcWw1y=qQo8`8=^$jMm@?Gqf3#y zx2Dr$!F9@E{(d_7OkRv<3}5ey^6!m5!`y?a)8n<8^Wh~^fZo{TtJB+Sb)D9sOOb~$ z1Fk2Pfp2g8GBgho`Cf)F&03U?P74^L6`g24Mb+ueovr9}6?4>l@9a8Vr!UcU$bV)A zL3Fw$xK7&}TGQz@#%M*SYk{QdbYMp-I^D_~HJ!dO=+uRDdX^ak(die|W{`UN1+yQ) z>*-_0Xho+xfu!oxp*5ZInWLuD^7VQ>C8P6_H*Y7AgXr{X@OtXos!pM8(P=TJHdLJk zvPc{w)aKwjx_t}Ch8S_NL8p7rdCA{zYelDt!F5Vw{(dpSXMXf|jL}Lxt;eK=)jv+mR}ON|*0eGO*XmI&z)vfmC~+%ew4&7)n9fjZ%KcF*EvlnX z3izzkGX|YDqU(@HF@qr9M-Li7TGT5LCU}d=XN*>KiZbZ*?$%axN@R{&i%Kx))QCVY zKgbM%=yWi6l-PwCk7hdgc;8!$(JP2uo?wiN)Ou>zf@g%(xV}x8;ilK5vly(Y(C2ME zD9{ns@@jz}x>-C!u<4)Bio+l*GY;5(F_(g-no6yh5WBerE7+m5H z_qXO1&of3a8_#77P2#Q9zBay%!J3WleOI?}SCaTSfv?$kX>hNIY*k_}rZIwhMKxn+ z636;Uyo$k^#1|MOo{nBemaBZdVp?#CZ)JADyy6e7O5EL7;w&M7<`u^=%VFrc78)de z6Mc$&t)IldN8}IU$FDHEU=rsuMli3qi!n4Czq{GjD@OWCe2qckGl=eTp1{|7Co^it)x-X}a)H^l_8qe6c;*k~; zQ+cmL4Foav;8sPCZB_K+nB*`7jZumiM$vaMiYEHXH+9iH=z8RCfkZzGrGkjQfO!V< zlPQc5%<42hV-S5&Wpk^?`ilOlLG)Vm5%MI3#>eWF!A0M+yETXT8)F0$-N_i5!_-wY z7kvt&XjcErzjdp3C(&P2XnaIp6x?CLTNV9l%%ud6fSVaZ6Fnw?=zn7rP4sRC(QiX1 zBp)sp>iURIW85GPGnRP)%Rg?!=0MooF6Um zod3hPSI2O1;71DxF~gAHh$fUA93Yq)9g0&9>xzC#Z^Ze1xGP5}6H7-u%uI8Op{sO{ z9zgWg9#0z0y((X9-?F0tHDC%rax3aZBXHQbXIcJ2d%2`&t@tt3$8*} zKNa4_e1@jNL=@PrReshZfnm%{YX@(?q6ea1 z&Fr>gL4|8cg$?UkRpD>V zR9F&Rg$O?t{)LGVO@&)fV7uDE2cR~#gQNe{YvDn3JM!tZt*UTGGZn@KS78(vs<(r$ zF)g9C0}sk;mj_G?}v9Iz7d_HJ!3n=sMkkeo5Z* zUK@3KgLTkGl-?JD>(t9nrw?f&1N$@aqv~`UiasZu%E83YaDFh<(_Hi|vZ<{)ZRg>) zrjy@#s8*x% zJ;?VhI-i5f)pd#%I(0JW^wvA)s8g)3PFEP5uNIwwJPC~3q|+cj=es1h^R2*?h_OMX z;2!mK9e&h$`t5SM+a9si=1KyWfKglp;p_L{R>MuGK2^ zBk}-nHngdz7CYX~h?K_I_bZ}IkdF6ZE?Czp7WZm7ZJJa012e$35pCK;n~Bkx#N@#XBFC3!?ix z=B(=;hx>NvK7<*xTX!>)X}V8*qea~hZ1BmCwZcPDe!b&tn= zyL7*S8MIq>3zKQO-}-usx_^e54MRJ>-=O<)bU^Y&L>gH40{BIcde39dy6y?aIh1ZZ zPR77k3}&|!9aW|g4Wr}{%)qF7+eX)sOs6S-`)e&Ke+V-e2IYS+DE}-vD!C7l23EdP z@QPo^oOR_d!+pCdK9w05m2Xpnw=tQf`}BXcsQZ_g{4nUAVbGmkImms9G_dYVgIBzV zIqSOjYwx_xADKbBb??Sxn(i}RZBchGrZEhgH47lYUPlgwGyJrVcly8Gkj zoQ5DHm|vXQY_w+)ts&?S!p+`6bYxo19+O^a(H@^-@4=67y7_hVX3=Xonz)Y-(C;=#n0cNOW}d8uB{@1e5@qH`r?H;j)=ci|p7 z-+r#MDGxHgbJO_`Osnba{(Fl$cVbLc=W9skM-25`j!q(o&O0&rVbuA4+(YMV{G3xg zFJOM>rt=7<)pTC=w-$A#^+&pICzHS&RO|Uh(z&Za=l$z~>ijh(FpN4cG)$(n>4EH@%)r=BYxA@E1DW^I zT9!he{PjkQoR(&2$N9%W^lU#Q;lgl1lu2RThv{z<(<(k6`TC-P4Gr1N8 zm#ep*TpL%nbDaGd2xwWD{$L%b9_d6Av>-!0)&!SpA+y!{i_37Y4rJO?kEzU{HMwHy z{N*x>oR<9SJ4|pG>+uQ0gh!j?dXpKnCfDWl{&K~LoR;Lu^pooZrW@L2ub4K;HKUna z>A~gN2sw=Qn$}*q<}(AMy|m%09w(Yl+>BzfUgVZI5sxgP*G@1x8`Ej)ho--PP;OX% zeGD@hdPh+V-Q^ea^Z~(2>gHO0ee^a{>rS1H`*u~*1I(b^#u&_G?KegU(`m*S|Gcj; zj$mp-H^x9R#_D|C7*A9G*RnDG!PL4jZp3}Nj4^{5wA&b0FBop7@?8dF6ulkP7|$@ZZj2<{x62rr%%I)Ih-b3)8$-tAhQS!uJ?m?XEeuwT zF^`O~*I7>v>X8DC?3z+lxFeaIMB z7>qFs9aWHKGM}k+V_by$b{Qj?8MNCN9hj{B#@K=B4}&p!KkaLbe=}G$MpZ40G1Op; zyU+^-F~$Q-tsA2Y?%QRI0nDJ?#`p!(AGF%Hy}d~}(`f;;>vCUX{Efk?G43T}JYncf zGSC+VF~$t0){SAteY=ct2{UN7F=+kHxftVJrqhfO_7rKC8f9Enyp&NCgXAxw`SZ_~ z2{fP8xHkp2%paMJZkccX(N4>RGlOOS-7)7;=gDf*gLG!W9ml!Js zX-$VQyJED=(?;6C#v*wCpz zedP(bQWqASEJlHAQv1T$x*8WcI(-U#6m#tIb|dO$4cU7wdh;N@daYLOCnb8hP9rnJ zt7D5#xgS%x6OE{ba<30w?go@5^qpZS*J5O5D0c~PbR#EjK)IhTGML6tZffvyQ?+uB zzNqWF#K_E0ZmdtaPf)pkGNKyFO~(*2h@E$!G@-Aq;kLY1lISq z;N@m$<(|Quh3Z!;jLZz>UhY$FuQHUIV?;IRn}r8~Ao_krGbHTKd4_T?H!?GnyBavU zzH_PEUyB0k`x9Yq%M|in@^;K>sOEZrWGNjRrMhIv)ab;#6ANn5r-DdGYT-4frC>s;~h^;7XI$V6;cM&=wS# zs*v}R&A3t(SykAIB9}2wHJTkKMI1~MM3D)>71>QQBCNM5i=v_g zTWXq8Lmu#7qn5}RI_)0HXo%cKwH zQ!?njPQ3kPd3p-HmUI2|J+<`K6?!ZA>mWxkTr)1p;ICU;&GhL_H6HrpaPffV;%x-< zo|Y+K(ENUa=BMcU;ES*iLJ5yf@i0?}H{m2f_=Y@_waw~Udkpk+i>_ZidYsvxa#$aUA?F;N5oX$KaU1Vm+@u`m5Xrus-$DNg$hG8c z##|61V!N>i6FYgUKp|#>2{_WMO%~Rs7#k2q`eyO#^*6a9(P^69A79JC+dQ3o%s{gf zwr9e!X1qcv9`1Cg@4*M(QE1W}Xdc^vPW3u)0-GtqftPWlIWUk-5#gpA%Q)om<%Xb7 z7Vf%coVbRKZ*9kMyHq^D?NC-9j~V5Mpx6>+Q-2<%8+j5t9Ga0Y1-VVsjWYVSG0Gc- zTdo3`Xa&a% zw*xyGS{r#3N@!;yjA;umXux;aTjjRro2y$wZ!3ID3^y&fmg5HNtjrp`WI?SeqhN~H zHOz!`HoKKDyE~hm?g?i!6>n$=4fagUJ&$G5V}T@dD!r+pH2f1j?c|rQg#axdH(}yH zf1(e>PmQn2q&_V^0Cl#3=yE2C`k>ggaL>3cRfBB`eZ-#ih~_W7KbrjQSjXRvR)0Ij z8~j}e@nU*8b0FvGGKfSr;jl|}c&29wJ_D6|KKpzQ`#guMjBXEy9L?=JFi)`Cg45)A zcLSY|>7sg`2~Ull|AB1=-Sat9HP7kggygxWj^`e$=N_ZyFR6ia%{VumJ?{^Z!t>_3 z=lNF8smkd2^^l`^elNy&)pI5@<~+?ncQw;R^?W2eHF|ys8xC3%f9_$!=35)i3H`#= z+BGJ<8a!~D-73ENb}7=}mO&yn>&vfVUq?U+`KrEklg#YeS#v|%5plqFnZM)=NKqXGdQ>EA^N-;UZIlF3>odt7K%rS^3hFe8gxVsM4WcI6D76#28%Dbx#`!7PwSWZ}?P}0P)ti~kbg{$EpVEKo`t!D^iRMp} zI{v(gO%F7>#kBW<&>4DE!=5Mm1dLeyY9XP)H0pDq;}3|IqP`AG8OrBTo5Xk)9a-5) zIM?(vs7Z7Zw$;-l7W`E=gdtHAErgZW+#zZfD-wLwk7&upe9(ICEd z%%`u>Z@Z8E#X70(8vS_?@~YsR%Xx^nk|@O*-L0+Bm2H1Ad$i!ZiQN;i36_Z?ZNUC# z5=qLy&Tuw;U^PW-z+j0@BXUP05%ZdxmO7#Bcs8H|w&Kt`@K4yLC#l;_UJ$50)2(VN{;!r5&C zWwNVucT#ZgG-o+>!~%JbrbuFE3m*-ROREe;wzh7>XcO-rL~wcw-8Afr5Pb6Qn!Z(LecC|lniI~_8ho!&Cn47+lg_C3>_#0c$CIe)-t z4DGj(_7AW}!P+|p)7{XH;oqp;Eh(2`g9UnMG3mDT(jCpqhlL&o=@|??6gj9#sSRhO znAN06il5X>2a@KH6kCTVoVKB8Ar#HO2a0~c4us}VGib7eQ^~=m6f`wsP0egwqR`Qn zq$P1nFu5Rf7m%h04Vv80WDVU^p~=mf+_pYZ@N9j$LTFljH#E7R2?5Km$Zdnplj1p9 zsw8ois{$#?JEWv2BPCF#xX54!x3oYtP&c1oYl9?X12#M$Bb=Q=P05i~m0y9zl$%_2 zSBkRvJT&BL988BSxHps-7KnY7HXcU+pR{N7_@pm?TR0bEPeuxi@SJ2bkk7bv&h?>; z6vbn24Q=$smj;^PQ^4sd%9q#)f*ScQsOc%}f^X+SXqz;+M+&Rp2=;;@IZ(DY$+e=q zN^znGr6?8f2{}v47IdY7vfVED(<8f$Yegk*C|ApYCS|N=IcQ@H3&~I&d&A~uY-8}f zUbb%osAMedxZ`Wm>cgP4g%tT*C7gVji8|xxY8-(U?^H;V7mcm0tvOp>g95`~XL!!r z(td2Mnzoo*!$h#Ix|8UzAGkb&H9<>ee3dfd*O>lwW!15^R}-0nvMIJn&7bL%A0_YW z@vnl3$iLfgr1^I`9D{%9C}R3|F$@6fcN1;>o4h}!e}h{Tl%lU_E(&n=A{EKHI^6z!* zb7=luegpd#KoQfw$>0X-8TS4y+ZWTn5ERDle*vb5=HDR3*5luqOho>z!`_DG-xp)p zzc%&xHy7Msz2bJ;{C%aw^lu3i#`dp(DWdt8!`OQK^Dz)$_eO#dpOFt&fMGDS51LX54)znhte{A-LO&A%bSzd(KdeFYw{KAL0eU+dWZ z$=DBx?cW-vi00oC#@6Fs9utv&=i*57@6*v@d_fU2fB%37tR=VF`gid!G4q$qs$-2W zKVwfsTo#&1J1w-Kuf6o3?oBhFfIyur&NdR#Z8CgaC359zHj|Re|G|;wa(EI$W}XjVMfpJ-Ulq)vAD-%UDkW=gZ2#GgnEqpLMD-s> zMz`WE{)3>Q{xd22k0ar~Q{I&f{7WYK5 z_~3EaKA4W`xx(6xWyFg6!CcMug*b|7`vwp+u+6-{q-1+Kjx^i%jex~{$o5pSJsC$a z;y#9DMD~D=V@u+c_F6hb?7akog|;`?ppBF7p-ij+XW&RUkR)%;QvY^L2><)?L{Frd`?dVIAW0^^L--Fz$(=t5^A+IoNQGTw>$P5L9K{gZ%?GX&WKQ znC~!J($xwkGwi{xH<0bY$R8uvzhke%xUuyF&QB@WZ?gby*ry!qNz6;Fr5%p6U~kOi zVE=&0n}>3+kD(C39uqa#W30g*V+!`qkPGoo;Aaha6&XfC)?ibWG1zZ_ zSBqj9W(qafOlAmno`GxulSK{o67267gFOi6rxfg4S-`(*+1;3zf?bWx6D`tf8_Ff8v`9p5i!Q>%iyIk*gLVMa!SEI3Wk5%vR5%L z1$zRHv|uNTVE0EMTK2@K!JcRd_C!;#o5DLtUw(bvV9&P(o2rb#u7*ikuw{(PYOsmS z6ztaxbTmc82=*rIcNl|x7tT*9*u^a1-?i*a=A~dC!nTAK?8}DmFfts42zIU^*yhzp zu5}p6HAVY*Xn^=Z*VT>o3)W~;m2nuk8N6DwAHw*p4kJuv7)JUU$Y_d)5$qe`r7_qJ zoS#y#Q(3^j3-*uL84*jrFpjifpD~z&eF+K?Y`Tc1Eh){x#!af?Ca}mYDR?Wa;hwKF zSchQm9BB^r08hKf?PPpET03KykHZ=*%q=mgahQjD+8OU;+Ge2n9m95v7@xofi802D za1Nv9@xIBwxElOlmd7FQtL2J*ne!!Kea#)?D*i+kK#jZwj<%{&-N8grr^^SiiDS$`dz_R1D1>eLJuVHqB7ZK+`yX;3V{b*Y{aHBD za^Owp9NdAznu8uTIp|@{K@VdNE)st37_Rwg&Oz@wIp}T7!9Ore%Rvg}2sH=2O*yDC z5dDHdK1M(I=N5Ag=HeVVn1$kB<=_>T_dn!d0t=vi;KY%ZgEOw;9E?O^%|Sn#9Q3p1 zpr0`Z|Albq$i{D3yM8dJP7Vecb8s(swH$;ntgAT~WXi!{0})LTF>-M41al6WYV*I0r*fSaUGmCI{oKIT&xu!7C6B9U1uLYu68Q>f|8Dn1kEEtK}ewVPDNbjwuHN z3`C=uDC&H08#aTC^Fd>rlm96GRSw#-y#FBw+pu9G=7UFZq~)NCmvb;0g*6BF*yP|I zYYy%)=Ag6ib3J}G*yUhKog7Rt=HMq7rsd!`hJ7^$Q%pH1H4uFRBHS+G;14>EB$d(k zez%Py|LMaB4%dv7c9P^;RT_v-PsY6l9RbPYer{{ri_tOAvodg~OsZw6nP5ZSj$&ml zUxj1MzA>um$@I9_E?{G*zQLe6|H-zJRFelY;#mHRv01z5tZ@qF3-UIORo)hxZy$DS zgtu`uMPLfDvR<*7mg!7EWgD&n5FaZ$j-_%8{~j^$br44OV|}Y*^IfI$_2c_`psye6 zn;Dz0se$iJ*crpLz1U1a928eDGgi4llw z1R`6H^S2m@W4Kv^ORupn^sEDgxX^PqU8ap(9CczuT2aauJ@M#|{Gv*iDj&L<>0mQ{ z3E@dn?D0EYE2{W;%1mWY>;`syy$1DW3S(5x<{G|bNDoH~)tt_94x5wS5%11~6Wg#bf&ZKDQGT3K#7r58{Cv!H{UV*Gd59x{a)Qm z$)z^tpf+|F?drBb>WUw2BfCk>mwq`1A?Bvo`1T$}U&;^S^k9-ZH+fCEOInlOT+*AV zE+V@Hb?7RH#~8`zmN-v^u~ypj7Bns`X4=k-ZiV)WAt=(0uOG|i?#8st1kK1?3=S=_ zlvPKmiIdrMwiIU&mL%MhqPr*eGT3JFUYOpRCD0sn2b9XovG2h#jQ`v?1(ow0BhLpG zTAw5$HYFYA@Q}I*Rfs^Owu<8NA=8uaW)L1hmipyI%+Lk?izh)51mKgEmCZPB-{D78 zjP^4Q+}iYbwy^Cut{y|>D`1ol;26!cX%E~toSxDny(ymJqGOx8j3;i6spudiVaXlC zl&ws0Ryf@g!VM?ltuu7LNfY|AH(n$Fo8Dy-T)@rtU=F}e5ylXA6YWD#vX`SIUj{0y zR@}Kxy6u~8zOJE=Gy{M~-iV(xa$C@V8Sh9aEgn>hmXqSjpVJhBDn^qNdPG`bev4so z7d9uBPZCqa^yyn{&d{T?Hh^t^3<`|kgV8{2W43&=O7|gYpT(Vna zQcGQBOOTFRh*foq>rA+b0(VHmO%u3Ag!2pBF%5UK zz$sS(*Gu3&({KX??hC@TBV0xshlcAWaPJcCICdz2)0adpftyRX-2#`O@%@ECKSqyp zKn<xu|VY5WuQu_jJ;fZ19F5|iNs#3idBWC zKtj#y$k-280C@qBJa9C@pdHF+rVQLfCS&9)#KSFikJdDklovK~%3mS@zv6OpCf4{ zDfG2PnD7+Qf1AM*JH@YsGBSxf&x3?m4Fm+WB3o<);ZdB=g^5=a{TxBxg6KsfXaOue zy_24TXOz-Y_#q`QQ8l!;BBpU*(z4Nl{5ls%XeBAll%axhUtdsO3`!E4+X4@_hSFPT zO|~C~d#sia{tUgYyO?C+z=BLoJ`+Pey){A%`TI3N;%7x7rpOj-P#)A^?8ie|>eyed zQM&1;g{JUJ46K4jtN9c)aOi1lc#tooFP$DE7C&RAYEtUzYsvbuX@v{RYGy-(-ykA` zZYB_u(52BtR9!|U^CR9+rr?(m8RF!fm-H6l?ABO?;fF|Qj%OnVM@n%~J|FTAti7NE zc@cz!Gg^gadOidZe!@_pT-=D8!m7bcbE{B9H_nox?@w~=ivoEKBeO9DlOxJ%fy@`k z^BI}ZMtMb4-zlmCD5w|Fj+PT7oLbW|RIG|;fiA=i5HFKDm!4Xh#!oE;`H?w#9txv& zTw1l^akmRF6+!9;eWFN}`>@QWSk9&>T~09ZH`j7eg@T(SnRQ<@0l*ysVThlmJ6Ps6 z+oe5BXR&J@&s=iHXkz7;Sf~qjHB*LHvO!l0yLub#+IeXd$6(hu7D3~f#V+mnF^gR% zc~qD4qluNBEVMc7iaJ29T+8Op#*PZCC`4gg)T3$*V?ybzJRIWK^uE}WIj`zj$hNI=!?{^L`PP8FjaC7R{dXh z3H9KP=)sl1pa)Z-+~azBH9xn6&xLYDPY zEGwCfd<()#i*HoPz73#=ZjyifkLFtyFz}5E+lwn^cD!_HldITgx|QMvxK?jOtLLK6|U?Sq*SOL8Oa|6IS+6Nw2aiIjRK77 zaBvLtqi6(KHSxt)(+ei9Mpexr9DjGxD?L`?m42%AO2?LYr3128au#}}FZXz*Ew6i} zxrsjM{&8NZ(PppY!trg}z0%jWdZor+d8NY-d8H@*_DVOs?3LC$% z1q;1W&2g{P1pZ%$c*GTWrM^FSrH@_%O(UN)=?1TKHS|w`|0n zLVwyzUg?XuUMc+}_Uq27+6YX!t6JF`vS!i2`$B3oK1LEI3*DEc9{%;{`>|I_dd?);z?3D&hLwg?s zzn}9;e#n0s?eEGNUg?uOwCUZ5{i|q8Xg9y1{au7O?3a9!2f2UaCa-kvRV0`E9SX1p4zQd8Gp6|I;Qu=@8<-_YSnDonC44BVOq) z=)eDYuk;%9--rB7&G$+h(EtAV4z|AmTEz4q`rnuE^Yjy5DR48|MGpA4z>bFz2k1Zg zvR5jf@0DKs#4A06{&L}yUTOF~#Q#07)DCjrxZf*zk^f$><%*+TDH-kI>K$lzL9etC z|I$h;sL=mS-`@(8--~0)u914KF3k71aW*2mNGZBXD)Og}EL!RDpr&xDr(NylzK+SQ zK1#%(wCb&A21RYfDDqO63x)hYg>FKRct zRt!l9;F1rXSLndP6EY3eap7%-%AT9~(eFR-_pjoqp428^yH>0Zk8lT zVAco9_TUoeV7x+YQ&Fy`6&?~NuJ}J(D>hNBur!}7buAz4=`j5We*Q~~U5~GBFG;nY z;z8YgQce)~;^7`omhviUbEeQK-reO_p1~=!W)dIS0%Vs zYz{Pv2W4eu78twc3qTTQ5ZUQCLS(lD;zuMPDyf0Ia$F)R_vg$8HdEf-Mnor`7(%EL z(b zQ~p>*{@5DE^hTBN`3s!t&BMc#vsKEE38i(ORzUgX$tvo3<}!62i3x@?fm?Z$31EVy z^X#8PY3#1jWgFG+0xDB(uIjjqQF_za2&7;ByQOI4X8@VA8dXXXj-rNaDKmY>Om0PK z#iSbo@k0{OY|w$q(1EJ6a$aDv`Ks*lXk@dQ>|T}ZIgsUq$b@_xVW<)Wy42;41WbwM9<=X_nksweDJ$qIOh2P?>U~Dy0Xb^icF=6-o;cik6Jjn`u`T zx=}?QY-vbuD;D~$irUF2ymXUtOv3}Z*wdtSHWRp&k3o>LA625IylfP;izx%DsM(BC z1F#V&yjfF4O(r3$QKgKfqm{b2;YM+9vADJ>Pk%<~?k;43N1F?GJtSrh32aJ7Gj)OS zMuAgV;2M?ZK#Le{B!|U6$E0rMbCBvY+bE#2WvQ9$LngalC3}I8%QuK|aS2da@@N$`11NOI zia`8T2?#}Mpb@QiDl>EDGg&W{Y%D37jVdvG4`glXkQii2r%KsN2*f>IHtUIrAoa`N zyF_#v8>Nh5DXSTkqWp$S(XJJG?gjvvDZi#7s~M?>qz4NPtH=)+shZZ2h2E{Ao@JD2 zl1gBL3?^_ZQ$UdO_mi5JHyTC#i0Ulaql(I4l$x-uKxN8}Ra8$BvXO-FB-N2lOLdt| znNjckOIhlsW}>egcA30>f#trdB6k9rGhdgxnoeiya+fiymJyaZMP+;msHh|EM3DOB zAx!F49xzH7!&1^zDPtI=XJjytnR06tc_olJ{ZJ)*?#i@kbhrH>prsO=X(!I-cs`?*+%9JOnI_5D-Z#r9n^vgq4 z_cWcO;t94m_8t;^97T2y|)dKdTs{A`2L)$D=O`y;4Qq zW)#|$g?dy}2BS<}$;|}uOyE||2SJX6DluTRF^W3y1lhN}iHJu$qqMOPs7!g4ijq?x zWE-kPsH*97Bc1Y(nsS`#L;p&aIYVW9hbTYLDd*GaTR2q;>1Z(_xN}Zp5vuMvsLqtV zs)&g|MGbxsq<*|)BUPU$rGG{odgfV|MF|>q! zOu0;@{GL!+ujv7lUtXZ1Rx_7r4(iAR4>EyUd6^09dQCFuvgAya?qQ?)!?P$B|50^} zXO!MbWFY-=dll&;q&B&111d{C*;shr6{wslREdN&SH)ljvqAj{_aTeg#Pn|EFs>aV z=GFz@5+-|161>vb#}ecNY3fvIt9aMwwP}t(ag96S$QFjp1Mdszk%s zj#GVz_`8_wTd0a!!zgtn_ajh#dAf>vlZ5O-l`@Bps&FL4h3RxPopLvNm`+y`-9$S2 zP^Y_zPT$h$hT&B2ZVOSJCAU#k^#dwuUkQQKFV`fI?{1~FQOXpSQpKng zN}MWR;|RgEPAeY*n<+n~@~f%a=2$Te+2` zs3Ti0P+4*pRmxyS>De03DjKQC3mK^gVK57ov9zQerxr$`y;wcj8a+!*%Nq}EJqDt9HN84~D^0gkPh^h4_OC?CMd$sK{$hvdIra^&~H?v z!zgqR3tg$AevUUZiry^pMHRJyQEIk5EU-XDEoGFNjaDr14iz=mC{SX7eiii)P&tPS zwJ_gIr~B!Y<2M|qQCsp>kY&k9EXb`~M4TIS&eQ00HBOZ#bo3!1c#Lx3RB!Q1P@O5S zc8GZWhJAWyvrow!kox6knbfURfK*RxK2TZmqpFl8jM7t*%PMYEkwrk}9yB!1biihGE- zHj=oTaikAuE19U9N;E>qvLDcvfHX^%nAEMD$5PaY&H*Y@{;Af%Q-F(6x?4e3QK=&T z6HQ@todsh}Mot3GIp8&Yat=SPM!V($+fd8E`{kcbvi~(La&{9vE|p}; z)m)d1RHYXC9pU7>Qb+!}$%nd?uNjb#no8A0mBouaFjES<3AuUlp`xjtj@`WQf z8y@P&TT2`Vsg=e3^-57?-k$is7Q0rANOUc~sxPVo|wB4!jFmJs-E3Y!! zpSLG9Z(T+v?C+N|=O&8o<0sgiL3yjY!kr18h(F!R@+xYJjurheI$F4jW_miJ8;%=$ zL(h$JKcsm2YV2!EWq>NcAAt5PaJ>?c2^bBS z0(cDYI^aXV7QjhB`<6cGKY(F?y8urBN&p`LwgP?t{0VTi!gXN4Wq@k{w*Y1X-UL(v zz5)CRXxiE*T>!`i+zXfmm=CA`>;p7!8n6Yh7jOcQat34q&I0rU+yN*6 zybO2`@C85yH16b+E&>b&+y=-8JPr5&uoLhTKuYyV-2mx;n*l+EPzW~k7f}MbLz+Hesz^i~V zzy`n$fa7eR4+Fx0Ie?b|s{jfhp{q~o z4Cn#477zgB0p0|x0sH{?6>uETr)^U${e>433-+X43j z767yx42t`wm~J>2mR9G_59|{^#{v>uDNA+JA3J#M){?9c|8VE=Xx3`lS=m{1%K$}+!EaT0lf}BT$Kh{ z}Okvgi+d5-lYdaGvCw#cHdPw_m!`6W1f%87NviZY)U+5AY;(A(?O!_pr_( zi-UU~5q1Ul2I+0}PNozQB6_G9?n&mzjCJCqGSCe_xT}lSmnm>;YU!RN=Z4^( z5kx+ijf06~U)m}9<2(iWVc{{J6a)+R{W%X-sqg$Bz-^-{(2efs*nk2ntMK}?%Cw3u zWlPWuC<>)NG@^jO3+FasE*$PjL0jMLKu$~O(c8~j%MKel}C_gM8?UC9;!{s;Pr=#lEU@#7c zq%WN592VSrGQ6#{CW(EBQ|)4}*uCqVFvQM3@RA7r7DNxosgi}=(O5IX{heX@aKy0C za8D8j34Dbjyn_^1g!((73$@$|!aERAH0TNhn{*R8Tt50bb9gsqk^$wz@V%7q4%~{A z1Y=UtkPJuKjw;!SiqLiFwG>HPi|UHoh+O61(IKfgJ>_<+r#}7LAr-YL@^-|o&6}P@ORDhUijNCH2q=}p(p>te=niG(|hyZj{LVX|2>=kw&%ZR@ZU4}?`izE z6aV$_-wymYmH(cFzZG@-qeso;?SJu#d~M>yg#)FcHDe>jQ~Q{HF7s(FqCX`BE-$UU zj|TJbfaDb9Blrr12~PX-^If2X8WdRN_2ucYHWM znPk)@-^h5P2Tf>>pwS0=7zoakf0-D7ljWM@ZOLY*L%+mVzPJz-Ez2*TiLHl1#=cB7Q_r22JpG8|zx15@JIyGa+F@G4jCGS*7d4#< z+}cL7@t6L|`TbAUI#y8viwfv(-r;tx$1aBl!#bh)@B+tHys405wTzOmY0LbWZ=EjHoa{h+l4#qketp2@$IqdoCWuH?PFZ)8v zV&VCeMY;USleIN*J%2T3@iW|rCSA7H_1Gn_neVsG~cN+HL7bpGg2?ds&uEa5oh5N8t9ZVqF-J>$7f9gwV!p%KRpDB zZOY5QUV1)v(+<;;FFl|7^rYsZbE;{rx%^~p-VgEN=MFX-E!9k>!8>7C(Wcs}@V1&; z!zI*%f%lrLwCh-N3&jpcxPsPc*w=WekB{MXlpg>#*8%A={2l~o zbW}FOc`6_c5N&+=Uq>g;W!BM&Zts;Yt8hKm8)@fhrbulR|9^Or)Zyu^N9!cN+ZZIj zgeDnR-j`8^r?aum6>A5 z1EG1m&?}&Yo-2P9@|ly0)z|F_@*R^;)aLw+wG58O;W%%#8|{^T;bLTI7v6xcr5&v3 z5t>CqQ0~?B42IwJK3RLPA~mx_A{LLkaGqU6=YngSj@!xdGs2XyMpNXrtUa}XWPi&#AKxQq4q zxKIgEsjeZK<3h7&)E5=%6wo*5%6k!wo+7~0K_QlVJR>N+2kM;)c3*Ome)hL3N-Xlb zGpGL$kNJeAg3Ve$@owC4Azp2n%%JtXT7fs=jtkABWsj%`uA+=NCc8Ab$(crpMYS1M zV!sFQYCoT}0`P4e7=>0u&=GJx;0l1Ywx)9W{-y923m)uY@FMavy59IH{kG%v$VcO8 z?Q;KSthq{PWsc{`@XP`p<8_Gl2_?wu>4gx>OR+_Qne_3pJGt?0eFs~$o8;gArpM)y zLm7$KM9@AC=?p%ah-V#*-zjviDInnzKX&{PGbI_Bl;IEyc_oZW3}qynZgSs~zXD5fU8>?n12houup5wVkJbZ%p>EIm@q4dOX zhEsozQ}wMht`y$J(Wfvq*Od26GPLN;WEshIWRO3`r-^kTciIXW$U>6p2uXqvJ44Q; zQE8K$^%vzW!x>IbE>#+J*?_GQ+Ab-@cMFpP@m2J?_uml+dk1Zes}fHyANiBz|A_*! z!tzvklO`;wt}t^zjv{X%_7D>Yh72F?E9VVqxU-MaYHiqBblc#1blJC z&iB_K1iqIB3RTf{=a2#r^jsH~1C6=AL+=N_F-vw*AYRR8xnBw4bz;`QT`i>J&0L~a zW6(%J{vqUU2;m{FfGVPma*YMQVXz4cdTqprtKiWpGG=^(SQ*S!Tbi=YcEor?1h$l3 zzsGXrZNE0etVx3J6wK;pYZjtHQLLhC>Pot8ev-_ptRencWTPrjIFBNUu^}u5q$m@| zazRhFyQwQK$5ohgXBJFh{!+P7mkOLCcqfTc~hj~}wj^Nm6%wIUX3S&8(E zXeBG*w?5~TL)$uhau?dl=pFd2K?-9?4psyTUa3h_;+6ZU7FT1ynrvs}cgP%^2Th{h zn*5+fuZhf>*I`)EJoyxhBMAPvhKuh}M5aV2p|t}9W!cWY%?)xU(;~~_@KBh;VH7Ps zmct%yb5ICxb8XvcoDfFg713kUY%TkS;}n_HGhqbxIh5swC=bObqebF2XU~!6Ej`yE#hfiLMnKH@>tr5krR-?J9I(tGqYBWk|7=ppX=b!QZHk#&1?g zFIQy?_#Ju2&~r6~<7^dPDimt*w<>H$3bkq7s8T-3kxa*TyCWWk4GMolm$b^O1XoNC zUju=`LwNSpFU%5YacYc#dPvw{igKdChTCmz7*L-LXIgB?RBcF795M=KYAvO~BBQX>1I?p(ksNAq#_z zH8gn$^Vg_XyD5{XSxy4ZHVg(B#NpsojpSfub0 zKgx_c0eo18*$`Tcx|B(i@D>>+50uF+T&~2cs_2{d&Ojc1eJf4I((Q(ImtnO(v+-I0 zNSQv=*71BRNNK(SO(Op+i8cpZ%cEH~{qV-EYUb%bZi~9GDi6f-tC!9Iv6j!rFtS)p z93xDmCM6d6b$z%D1bXK-{0=}Enqq2eg#ka%d6fY{KM-WR7L(e#wzde*BD$h2TlNAw zqY5{Uq-8j}Z0M1p{}BI?77&&It`gbTrZX$SA`loFjM|pXwi!kwvJH*uRw34EUH({S zZu2IjPAs#^l{NT1aA@%#Be9>0m!$P3uD+`=)hYTpc=F0B?c}ip3QSTVL&$Blv}Qf^DxE@FddYjyk3Ar5e)H_&pQ zD5DJqYX!a5DUtercH@P5CDhB5Uv0My=0sH3+i+h*Cgp*)L4*z3)KTX*nNJnSKeI@& zd~d{tk8N#m3l_?Sy$!$bF^>xM#o;qSZ-~RM-{Td2JXyvmKiY0W6h(B{8*zI?XoCXL zM->fMB<0N8^Er4*N)C zM}#&g5@)LdBas+xFk+#t5q~09F(Xke2pSxT7X`f`5?}7pBH>on*zQc+8PQ=MiNO(} z4T?lZRbV6%*BFd=%GL-Ov5FaqwSu6*k$6VX8zS-fPAw9t%1VA;W8E?N=7l=p1+fv$__u#ZIVh|mT_ zB3Ts}iNt>lMm%b3#8$*AW+dJh1PzWvo}f2G;@$09B!bEk`~9DY4*N)45E0s-NSuV< z@Jj4e@+8{bU_`F15$gp{^bzxQRj9geSMP}VprAKI;)hG6_Mj!05{ot(sm=|fN+l7 zC3CQ>JL4O?Iy60rwlrJP;iI^K+SJz94+O8){H?)w8U*SuArg*XLR8SDRqY1{eR0Fe zH(Cge-rV{`1XGk@YR=c9`RE&DVzWj4apg2y8YtqepFsQuyoic^eC>my^n((YfT9?> z4eJc6q3?l@`cl;G>L*FC*!NPy``K6ggXu$2yo(~7-Z-4yh}+!sb&>=3Fy|BjTr1XP zomYVihoSVwvVu;IyeHtruS;+Z9xO$3_(*3nk$+5MLXjofEp46nRfNva1Ud-gTG<+x z3gc2u+6HUJ4e;DUmJRpZV{g`(2D6$<_-II^Axy#QCFeWbUw|IFmOJQowem2tWq~4I z!w2HG&~*-^ttas2=-#-MqkFw5hM}-Vw<`?nYI2|mqlFsX`FeEe$li@HG`Lu!y9~>Y zoLxp2cGb$W5kr8^-rG8Q(-RKA+zNPxgy< z!rQyBi+Z!wg^S6BZAKTi)ynRATsVOEnq4?U*xptYZd(`n!G(S%7Y4y5wFw3FCPYW} zF0{9IVG>p;7|9I1;Okm>2uzHXh4U>gjIQP^3>U=^6xJ*Zf(wI8F3iAKrMmEf?gAaz zyO2#|pEV2bppWNlHM+31Rt_VIv0S(vcyku!SFsCEiXx1{>Vh9G-~&d6VX_pIdl#x`e6hN4F1b);bfKzNPN>I)9}#7<3oV50O+=Ak>%w@rFy7=s--rvd zbrp_@1hgGA9Eg*6MU-~t|0H#DRNF>G)a za62ER0Qc$0f3;Dxe^IPOVKu%x zjPGtTz7|7)YJ4wYd@pHBxWc&;a z4{GFx3*(2|8$X7|5o_d^p&#e0HX6Sg>mNiemhtxhZ;pJ)dN%$UQOrhRHGT|?A7e7U z5*=SPeu6N5g1zz2(+FZU{xJG+PPx(ea;$$4xmd=(54_pDm4(_E%hM_Rn zqW$Pjp;5|mmG5UnkzAr%gtc3`(i8c9j5|vC!nDS}kp>E#U%ONK)#&_9%1rz-P5j!e zv4QCPcvOlmjBEM_oA@>TXWQ{7v;ChiKfXuDH=rviCVox-&lIe>{wFd2!_1$g@o%K= zs{60;ziP)X;~MX8ysp{AWk!7yj$l6S#P)p6d#q+5ET z-dq2UATH%ViJLZY0}p@6wAV^g`jQ&pLwn#584?GuWs zJ{VnTYij!jnaa<9l#68B4Er8)P`<)~!Wxu!RDRX1*co_C5Zg7DU)U{ujLNZ9=2iJ) zXMo&l7u~J@nl+uovcl@tHcVNDK7iJfh(VZISL6zUewPAWOOD*-yhyOxIoahSQ;*2A zRegiX&zGvGsmMj2X@g4iYZqC{l*4w8xGaubPSUi?Aj*d0c3j)xEH(9r4M`2Kfdc=$ z;IvytY&Cm71Ird`;K!-_YI{Q9i!o+J>|J!ij_X{Dy(5XM0oQwehhLOvoA#e?w)ZP6 zFs$~zqw;Ir+A^BX0)cvMf%|>r!i4grtuHqSiP|t@RoRy$T5hIQFLiVh+*Nd!wsy-{ zMk2nTX@6z!0Kx?KqhD(I5(H6|y{B?pl)Zk`E>?NW>*HiUTkWUS zr~L?q_NZCi1*FAyYC}Jo=}d;-ex0(cRh(0<&95np-t9tVwvIK6!-}c`H7&Ny13mo;D?^SuT!Pdqh)#$j{IX6i{FG}(PQxi2+XlKw!&;Xz4@)&FE3Ul)lCBOv;95O#2?1$ z#2Up3^;zPxSaPpwNs@AJt)0l`^@%)yK$)F8qmFa@Oj$qM#Jn$}96fYTS)`YuPg{D& zUfaZss84z?i}agR>00kl6VpVMWRsW|-ZdrW53D1siP<1R65Y=?KwysIwq>fHQ4%vn zh_rd2u>_pr5ddnqc0Yz_nblkH)2|7-hsS#BtmT2m#E6Z=ftxWz!FQi4B5>yEj)r`C z?A#iVkM%gy*hmkOtAoG1`-6s9|B&E61?vZaLyfS(dL`+Qop~Lin%BQU=Is>8I|cJz z2ZxP$UmdhFZ>kWF`KNC5UV6VF(d&E4<~i-nn`IllZxJKvqE_?b8)V)h!G8+Ty8|3H z(Yw>uyep!bHvxle{XOR-oPc|$VBSV>*qC>jt$EK2@rEw(1%{aV&AQcW7XQ*T-wbc* z(Y>5sSGcqx zF+B6s?K=R+qua-GU-_?gF31h!w^;sy%h*IHmG0JM#}C zpl0*WZjkwLyf;^7t>AA7qYA?|qUHY#vFwv7n!Y7kM(EFtz&h-1HI zB_wz$ZsHzJ+DJ-@yzImL+KlT}P255GQdj7|q(XhtejbV7&A{qcg-O^D)5O9${b4;` zUKpR&ei1{4b{V4)Rz=)})03mwu^I6uk5%!!pOO@9N%D#yCKuIv9k;wi8q|vhY#?7Z zI4+D`is$;xW%U(^%Jz7a*5(=lS%O!XlW%f4)uC6;r|u|&dKf>4XrH&|2D zW7lHj2+?X_j_()LVi4vWFMg9$SnOH^yOg#k3CFvS(UNtRDzHJxItc^czRCGTEtGXKCN9R-Z z;{d|0_Hb$kHq9>sz9<*k{=J>GUWT8HeY(?mTgo)?sqcZyI0Hm2?bhr0GA4zz{mFuJ%_XiZSuZ1TWD zSWpj<*geP;4oYI2S${-mVUd)Z0RB_L#&oQ zAhc7Q>b3ORQ?|6d*;4h%E7ywbM1K|neDt|UXFG`{gVnrkNP!{YR)Q5EP-8*%H}EYN z(<5Rz=9YJG1lOHRjoc}BldWxig%EwpwzPr{|H`(XkW0f-sP6kg@R=5qZELWyu!iLY zAtbtO(?D?Qal2X-%Nwl}Ir#w$Qo=;Mbw#|zgge}fYS-NIE?d&7LfQHahaGH9{pSVU zUy;GO>*uW?ICWD?B4W)c?x~Mp%gdFx6?W0PN$^IGUjKh(QWI5dBzl)(sEZmsXH{BN zod|Bny26_5_r)xx&4yNjr$BJ(5ga4LiY-J=b{IoS6m#d4+n9SE%tbdJ1~%O3nn=&e zJ@c&TLPxToxQHn-lIhCwWTw#XlKdGf2GqKkB0GtOjbTio-+HuKQ2dIKS<~{QS<6d; zVgpkMEq9x>1O>(GOd+%kF>4tsC>}RxdCsh*ub{X^Xh|erJ~C6BCMbMDOCtHQ)=Y62 zYX{VJHfZ_BOz|}+tQlU4@LRQ{X`yJ|Pp0G;(1)ew5kxv9|9Y-3?$MPYq*3RtkDF`2HD_n-z%2&2)vhz3YCc z*EU29#u@xdY^bh9g0)TzUn5;jY;{dkb!l4}mi64VAh1rO>J4uf2yVJ`jd@P}_1S>$GKXhSO0h3ko0>NEpB*+yuMMnB^ z<(TcSn9+hg`ZA~wDUWss;OQ#2IUu(}xw6kT{`=?EOu7=fz1@f zHKOpL2;*IrWeKJaPwaH^s|?Q)L}#GD8v!RL;u99n-k%gqPaK~-)`^$$B~NY~PEYi> z`Zm5l0kwF|a$*`j?Kv$CZwYn^t$WcfpnN9^dTpZ+kqqJ&=)0jLBezL7I}zW;3LX_w zjvA$`#;^qTgx%+dynDG-ztsn2SaHTcD0 zZ45UxSXyr~DyTecE2cw(#r#pMH}q+k(QT!DA!xLQZngR?5JX+CJR!IZn>n8r!FBA) zV8HVP^Tl<9xutk_Gv46LuW!Z-kuNsC%^y5Mi^S{E)K^q3XGY~?+fnQ^RjGPcrq$#l zGh>*%3rOfPnC$%DOg^+Z&{@6GAgoS+)tD#V4|DMr3VuvJQH(kC60A9%#dyRTPm)t% zdfxmyba8EB@nSIqId=#-6Hp+q$#_!xE&WMtI?~0O1kE)FI)b$a1a%RDItW2Y5cGjA zh>q+94K@f`Dgp$zwvnerlwdc;zPo{ zkQKvY(H9Gjv4Ufy&S8AW+`%mR9$%bb=_Xh_I*ak~^Gyhb;d#R^pJvYvhq(9yg~hIg z%%QJH7730ug5xt$d?<={Me&9xUKYhdQOrewAJR#P6`H;4o%L8Hx8YSX-f>P%Wma39 zg)*$)`^pmr&JW-q}ijJaaEsAC+0!6T(aGubfp42Bj+4Xc; z>7GQqF+8}ZA6^+A#>>z7gJra|+vDm}?RpxY&!Ye6E7r-p8xLQS;Yw0*LgUMDcV+=e zd!)^?hmO!Y-^D4BprYoAqUy4}jk}dU`zd9*n{wzxa9!eNxsFK55W=pH%UjPa66naR0@(=-vR|T|OxXJRNTK zNmIe!Cfg@nJH;nGJIyB@0=)OQPg0)pNmGh^(oZk@q**0CY0?6pbOGR;hahXbPs)A8 zCv5}&dhjm*|7E#8X~=_+Imss-nC_Dj?(s>N7egNOKe7Gv6CtdQ0Pg)9iXNFH2{v^JkSLlEbOZGN2>!pp z|2Fs^gk2xQ|4GpQ#AAp*{67T$@0#b6c0m6^`2P*`JBjyhpY+{upY+k1pkNN--Ns$Lk?HN?=-}J zHE1T!guZ8d(rw89<`;a@%|4&xc-tpkeGOs^{pZ}~ld8af`Srlx?~@*$>XWtun#}M? z<+FWKYs9~Bj!)XV$S0*h|1#)*1^h2AMr_D`@SpKIXu+QY{u7A*1F&OazE8@B9Vw8J zk%jny_X_A=jhNhqHrVo7pA>}t7jH+L!9Q@cPnr(fM+AM+_kipWVg$brqWv|?M7x0g zSCRWN=x+@l;M;1L;vZ6ebT)+J_G(g z2mL+a!-de_VIph;f94qUA<*mvO#r-)`hC(8$om6zZ$iHxa{ch3AN1cd)+cR+{~yAR zZQvjDhEMt${Jmh)pmgLEI&K_41OIo!eA3)IVKewg z-+(rF75Wrt;=wCj?UU{U&;6)-8OPtF+z0=khRl!Aeu&@ry~xP-&vz|WzkmLS@%!gR znV!6(36q=k+#D#(>{yuD6-8=A-qHBU&DQqsnn=^z+Wx81l!|cwM){==PR!c}Q}XsX za=YS>YsPONa4qkjn76x=Yem9U^IsS!1q%D81`ciOP@1!4wtC#Y;-Q)8PkAL8Ld`)%G zG9P_!wHJ!Ky`3Ns!>R=NBZPJm%+;*NS{+}P8WQk{camii;+ckNsT78l?M{GIdTfen zSAF1WJ$@Ym;9CCP{1p_J zW!+H}C-j5W;r!&SaE!ilkFU>`?L~$2E3HDKpf7EkD8A7uG>UCng(hRWR-sYs&?+>F zomz!Pu}iDaD85xIVB>Sz;dFY>57`o)UaTL@(vP0dkLdk#g6>KE=qdf^Y5j;^1SII@ z>PPeRqi6IZdOfJ1dsaVMpdAfxCJ+wu>etBgFMz{<#>;)uX@G8kzJMWsv4Fb)MSz`v zAYd-wdB9JA*8#r+-Ul23d z^efwwP@I1ewM6XQ-s1>w2^6{w1l)-5qpYSlzXuV8lLLjx2E3+@8mgh1+2Yp}huDny z)N19X$FKm7SR_;@Ttr_mrnmO459F0O`1KEkp@X2;c&UNQ)kjUdthG2HO{1YUFaOs} z!zRFEYW{WAh8A8#ogh*TI_e6BiW2G&#&hZx#&hZ%#&hZ-#&hZ@p^}&JcTEBP_;MJL z)ORe^uH{=oCDfNx43CNl>d;z1?<2jhDLvN}7f_EYrp6_OM%9Me1qw$wLZjkCqY^@+8ihtB zh88v>B-(ynX^*@k$y2u%wJGwZgi5%*iB?#`ZL5S^TnXh}O}0pJ2`9FM(^IW z{i-Oa6$aK8yn#aMhicju2+hMMuchKu<@C3JI@a0&9(OWIw3k80LjKy2J5cC%g#7WS zU=xeprcedSen`a2!vpc_@IUqx3I}^yArLs~xij4NT-ORZUmHh(ndosl!X3{I`L{vR zcEC=+w}9_M{ym84S2+9u@Dt#dwf$-mAimK5d!TUSZ-A4o8TaC9$GF0IA=Kk@;d!f* zD>fFDt(6XAWmcgEWUYhNY1-Mwjd}aKa&*G8D8k_a>QD!(yOeoOh6Z?CMFk{liKDom zV`L#8e}Z#Ktjl_rP}p4gd-1pDuf?mVoW0ah^u^}g2MZ|H!Q3`^)7m7s^54YC+JSAz zUWHPaUqHdnJ)>w~o4muo7vU`LaJ(!3F&uy}9!1T);aQZN{L0+B5z%>+^n+EYJS21} zE1E^I4HXatumcaG$0E%5i1TLrk4N!}{f?eHT`M++`#N!zHQX_I&A^j~0)?G=?hK8K z4-}5Wl4~4(rjNr=Kh6ngRyeLr@z6iz!T;3O=6&wSTiYY=M6zq<`G{zU{lt6Vxm`GB zQ7ggkYHlo8R8H;INTQ$pgZcdNK4TzyTgM$ zE%VEAJGnj^dBC+|;KAwTQc#l4s=X41y;D_o)D>`yJXzB=P&D))c2H}t3^<0KtVs^6 z9e7ge5$Y7UblgeT%(OUId9@TC*(@*}^#_9Gj^N(--km}tn@#Qsp>ZO_;e_PSzywcx zU&rLr>6`Q6s?B?ghyI;BkGkmEf$b=#a@)TVv}x^-$q_Ix>iMe`_UuH^~t$?;`}6aEi#?;amjb@dO=%$a0{BydIzkZP0&LmL}xgF#ItwgF;@ zh>&neP$5{$GezptddXC3Bg{AnOy)2ueJIw}@@Su4>{DB9A4|jw%p@2ffD-VMaFdJT z83qwhAs~?7cddQSnKP3RFQ501H*hZdw)R?Uuf6u#YwvyLS!Z2ZU}JY&g7qG%v4`4y z`;YlfM;^?=Fd2>6ckJuvj;D>ZbocZ`58DC&`sHSi@w<(;v`P8oPsAyA&z{KBgW$0~l%2&T#fE1qezlfG|v6J#|nZW=+CF={U6$nWYY? z<;I@Hm}5I$qDMUIMvJef=i#)M=Qx0uyZmSYpB*=g7G=G20_eyjX6AZ~nApp{EJ&k4!?VD-(15 zQR)bRZuG0E7t2e>AQtneeH$^eZJL`Mb0Z9Ju6>X$muGCN{Mf}5(=-=~b8dFi+}xN= z%aO-9ZtQW$%RUDFCnuivL3mv~)FmjR+|Y^W@6FAT8{foB(I$_7@eqqsUJ-?6ZJL@B z`zK-vhP-YY1SNXLSJwh2nPwB2Eu5qd@)4B&_1)=t(Y%T}QtDI!x{uF_8_kPxOVR znw@Z;1D3#PX z;G~V7&Xl4zlG>u4fd};rbOY)cc#s00iZqj_|OqJ;NT34w3?Cf3{p6*I)M$aUd9|if*@Xg9?JWpcyPfFd07kE>APEx$Uo8m_$#S6SCzA!0X;2lSIStM#)OZdyrzbCJIwOYiiB)sM4 z&xBU~3NO-D%mt;*C$~#)o@~L8wwV&wuBDj`x{6zQPk#Qi{CsEh^Fh&`LDqVAwzR{4 zMvNXW^XM_qe?|-+FVn-19Gsc~gOuOm7gHQ(aZ((;LBiIuglRVEhuF=zmZVf}hLU?P zm|dW(B5@6DfSmON#|$$>QY%2)KUpM&K%N1r(46lfzfo2z7+6AZp#??uu`9_azaPd3 zPoz8>IGOZ5CkRUszj;aO4L=G>_CIVG{NCs?ek*h5MY|o*GlTGh^=p^V96^3Q3Q?e$ zgZ%ttcW$(MQ1rAziuT7NG5F^2;5!%QU@iJmbf0TZW($nu{8lj<=kaLVN3v4prtjwG z^_A3<-ZH@=<9Z0!Xk2S?eS~XBtMHR5R;AKe-LqY(b350#2Hjx^rmH#L^H?RblGkSo z`9Ff=ob<|np>Z(UO@Gs0!I)^VUjAvd-$Ij^MNUhwc0gUa_3~qgnXlre-dJn3JVS4R z_4cu8`|#o&qzpWQ=h%Vo<6f8d3>8-fQ<0`}S5YKbo6%IA^*DhmUKiE~NPWmzXgEy3u zsc5N9%DrU^O)m+a$giH8W3}k;@rys|YjdrZ7py_7)0Srk%LfP6yV~&C>kZ{u1ZzXN ziylgw325*7+dby`;jeaD>jqS-{}9nAZ1A4gj`G}0>i<1(zK7pn*wZ+ujzDs+F7lkKkQiee+^ie|6uX+fdxRH(?i`vMsQGarCfbq~$Eewh>y)52A)R(k4=Tn=;!oVW>nQtWw0xvYATE_wWr??eV}~ovHB}T$shJg@w!Cm0ds5bxF$j<0_$uO z)`+KAlf2g`r+te--%#YtQXJ@aPNg&(->-PHXWLvj`KDKk%3i$BL}D`np2m}MbEkKd zC-Axb=Rd+dU2bgTmKm6jZU;avfYU+M-a)_&qW%m3I#K%tQIkbI%X+1FhjA67pccqH za4AETY1#PP;+s9&1yrW7uj+_Q-!E>kQlIzA4UvVJ9;K?3rmRg><3rmbhaGM?Sam~i z+}H$9C@&?Y1*=Lz+n|*rk;4)uYFITG6s)=t3kTm%WCr}ANa%;-sL;qBC=Mi-N)g{L z%IIyp*NL7#?k41qse7wR=vQLMJawgOgQ60f?Wuen2FkXP$G~B@BBJ{Sp#D1{4tH^ezSHL+-NWfD524$B zcFk?`tC9DgOVK;<6yJ%-Jmx#-K#Hg7z6FT<#FKdpuRpB~E~jk4s`+;aB+UGPd{y^` zgJSo{tM8jHApG0_kgS{m2aAFCxoMjR^@VZsJtMn&ro+7gHaH=*-9bcU!o6R0uU0iO zJ@94n-=E0u{WAIMwEWNl+&>{Pi!`BtLqmc$D_FJo!Qq(yx;rLV+WbB+#0qYRw>;y` zhqrX(aN)XCyG-obQe6~Lj)(pnK=B$7nS~LE#v8TaG))w{Yp@Y1hF36SBeuL8MG_P@ z#qK~X?NpzOO<)wQaT5Ar9$G*-UK3(KI=nFncu)2TFVHu<>Kf&^dJ0Y&AOl`xRZ`v8 zV`8MNv}a;mY~G-3gg2+nevwsK=|l_#(>VBO7J^YVz0K~l`W7v+c**s?(g$2U)|Eu$ z++MAZ@tNvdiuyeqXsx>lfBZ{fpW)J-D3g<3wj)PJ>I(zXW%)kW+qQdq{Kv zKlhiW<>W@?Y!^rmeL*@I!~K;fv$?-?a(VZcP7@POXZ^i|CL>VQS-{pAWY0tVM$9?M zMkj^st{QnBql>1nS5j_yHK}?iZ8s@xD=BUN{>5;i=&Jis%EilH@JPbF#Nplztn=Fu zT>eKCVAhkKT~6Lp3Z-#~+*%Z3#l4*7Y!o8h9b8U6VG6N+UjA1O=_-0TuORqo^2g+| z{Y{xs-=DQ|JVY#iP78_pXelUB-_u%1)b}SXBaIqQ1X#$f%EI|3UvVxF^>K`CYA*1J9)3@_%a~K#|-CzsLpu z&nT!VA-z5HY%g)PW+R)PE*j!B#1m=)(O0#QK=c(38Hm1&V9>t?cY$b1eF9#K20_4! zY9RqH!XX3RIs}9MwYc{KZv&Un@oUpU0^aK!GT^O8Fz9c^y&rg6GzbE}&00vnYv+&w zZxez+KRM_6gopOosudUQ^G0%U@^c3L+fs|0<+npCFXU;v783GA{?ddzy{m-;+V5x~ zfi^AWnY7$n2nPK-a2IG(dt=i~W(b=DhXt4KLc+79IH)3mw2u93UY*lDEa>mTI~2N~ zvdF8KQxc5UG*4y=LYyc6;a5DOM$c0Kt% zqJzu#(cS+6?sveQX=n32cCPMxk9jyv%^c=hgaoN>Vjhw&=3 zga%`j@s9IV|6ycoh%ywh zA~7^>v<@cZj~nG_YEI=TMlT;rEl-I_<&ROs^5eLl?7TEG(nl{lFWnwEP?`Zrt;)tO z-HevtxI$4Qt%tK{wJjmU;R+yt7Inst&i8~mIVEz?p}szwrOV}8%bo%+HaOFZ#kaXM zRPGK<862t}9oc8cc7u$l??7HgOGYbrSbImS+>8#Ec6KkVql}f8lIF*jwEW$?CGFU* z3BbJ&T_xmKkaF^`WLE$;#K>zoN?ymdhWva>RCQi3#U)bIqi1`1P*xp+r5$=s(Vlabh=cC%QO?w^{PwqO%hxNoNpjdpl(Nv|9a894@DAV4^+S{qDgQFp^PCylds=|$Jz-9{_LPaLg<62Adc~Y_ z-kdTTvl@e*6pZSZ^uQckBXM1W>j$`~-?Doma3m|BTCfiV-aonF z|I#ptRk1SiZ%Mo~zL-ukNvz5#&6Z5e8TX}2$FN|P^O_S)qfE?!!zf2yJ;P}Y(&8Up zTzI*JUM>pFb`~Nqm;!mh+3q1y6v6CJ<&}}R!?p|WLt*^eb|T%KZQEtM4>rAD5^{!0 zN1Gz@w0GMsvU_~CouLk+;E>=I^6J@u8c!$Fo{bco?btz)*@#4p9vqw;yd*i8mk5SB zeFr199igtkN7g_a%4L1d^y%kF{+N zb!j2Se`v7U$`wZ9cA9%Jag2~bA4Qs~(}M*6n8<`$^;p6i)!A*^sTAl-yaTF69Nu8C zYa~jdPQ3=uM==zn8oEUdAXAT}VyMs@M1_)8p`ecwHTncU#oQ_qCmU0Tebyk+rj;hx zgQ+bz8w0o`IhdCSimF6Tor|Ds+hICoW4&e@bCHSM7H4MAd$w)6DTKOAAyj1wp(ZT^ zd?TSQEf5?6O*aG;*jn&1)E3cSvu%+8IuM!soHRI*bV=ehPkY55BzPwPSD^z+B-Y!883UzX)6ur^Z$wcoG9ZTyaG%KJvf-VWB-Xd7d9ZfU}_${Ou zxKlZr5}C>+q#Zl(a;(WBe+des7zC3_(yUaI32GmbU0p;-cDWI`^+^fpq?OS`Gj57~u&MvG@%6S^pLGplE6X7CES*S0eVt<7Ad z#v&c6w`dUC9Vi9c6GY2VqTXytiNt?Oq?R%GiySCP(Sq$dw;5(4QSjE>fAjQ2p0*R? z07r1k1#ab`8`w6XCdAs>gHBS%*g(-{qaKmX`-NzbdW<}u)E&?(v>suYsMYhaHg16r z^OAA2(urk~rX|EJRT5zh5aT=Xv|X&au{8xX$gT>cW~HFVQLVy72&}8 z9Q@oQLWyZCrYj0p!1dCq?Sk?6Zswy@2UowqQl-{V)Jm!bQC6(&PE*S$ifdvdsNiTW zNR`dE01qm71s9|m=YuLPn2D&s`U)L`(74GZX*9CeIZM*(>_s2N(_Vw?(4u^HYVTzy z{fAJU#otEvaMkRvKYOUf@(LhfPgn7zxcqBu=#s!(+BkFC(^PSO4W)S{x%o{`VBvXe z;;c9u&bqG7Mj!LRR?Z6BNt?AUJzRoCj^dLxTU|P~-6GcGw_x_`FSWr>y&A_bZLlLZ zd7}G~tszjlH%MN)r{m6acrgQ!tUw$mk$!^arS{Y(o?45t{ep#8<#af! zRBnFiF`~dT0=hdq=CSaK()BQA`Fa*WtIR9=#Mruza1J$DtesRW@-3m=n&ffEDCX>^3Z@ zwq%(XpcH@UaX>!c^_QGJhReTXX`jD zH<#L#oAbwRygxHM#x?eh2kb9ksT*4usg>#-Sb{{-k!vE{#DOC@qKc4fdT1v)+Duv| z`b2J?g&iO#o9eJedS8CQCn0vy_&&GR$ju9Fu){9)+N6`ASx!VDbcy%MP|gjrtX?!m zr8PcKUcG(niFyQF;p}Mz?_dv~a>7^dzS!!$2#-sEYSqxxHSACzD7^+MU z?era_MFf~}sC^gSw);P%l}rC2cv>vJg$`>|JvQ8811@%ecrQkVaW}##HPDl0$@5^_ z7q+xuKM<5yw$zg~vN?B>u{ekdsqxUh^p)oZ~%@S^4V!~sVVlfzpkT?2DF0y(vDi>IlH`M`{{$c4C z+uEv;l#b13;j9kq&&3|{o3V!x2(hF+@Lk`c48nbD+_45YSqiqwtFyk*xT$UkK6-$I z%PWe{UIEw56nk)4@!4URDnzWN(uG_)EqtpL#W8>Qy2WiMjz0W#i%Td@I_nFOf89<) z3HF>navGy7X&N|GuwP&expm2@V6XO;LHJ#?ha$^6GMw!!ijKSzu$A_LjsE?44R|{q zJ({LO3)%`gGFxh)2$XF_9sUE9sh~xQcBmXT0~;$g7PJ?&_@h*4B$wWVZ3^ z@xUP)y;5AUh{Fz-%oZsU*l*2@N)bA{WsHwibQ%F#BWzzCUNP<@NDukR_uUYI=D5K- zNN)Zsd5ha1m1*(J(Cuk*^8(T*IiaTpxdtQOF7J?Hybi%IkqIt(iXwO122K|B_#R5P zcxRv^*?q5OkVD&2SMGb2b6V<3d~3*IPHqeLbxXhaKV(ZGAR}};6xFxCB>oP8f7<^S`2P_eJ{@T@{(&P- z9?g7b1PY%>teM!2urqKr&dOsPeKOLV@dOiZ18- z1-J7rlH0i|KYAcT+U8rst%^N=;p|H9#i5%g`%b6TW%y2~zeJ7X#Wrmk;F>qmwzVoU z8wVDX^_QiO4!VB_hkTYUL66Zr@bijBQ+dAnBZN5+EFYzM5D1oEt(50CM!Z?UC1fN8m(UtYpxf#lf-?)4$CO{w zRDK;ytSPr*eQa9%KYfd)K$&;~i>6tytx&-sjOuHAi>4ZJPVDc>_cWD{@hz$}M@~WH zlOb=juCe%T+T05&=tz(b!7ZHX1U)ni_fr1d1#@#)zfr96ixUq!p7SE_9| zJEKg=ou7y9HN8r0reJm6eCln}r>V~(7+CLKlmG7ui+T&TCIrjfv`O}cw(_xZu(l*v zi+zE$-^W#oYkaV_ELeL}u(mu{J26;W5v;vASUV|LdrPo(a*=LBnOgSB%Jz7yA7xUfU4))TCqkHVoBqg0+i-OMJ|eRgd5ic{s+GQ58waD_doId&wT$2-=F0> zZ7T_``d_~PjqlI#owj2H`8aBD6|FA>`AlkX6|E=)SJ6^Ja20K`2(EgO@3ajgxN0@u zoB7T=ELPE+A-IY+NvwK>-)T2RaMf#kr)>_wRqOa3;d_+tEqrg~`+B~=&i6LHZ{Yhz zzVmj3Rqgz~neSWpPMZ*dt7!8C^RkWEPxawWLzr%OhG!R_% z7T?LV3a+9B{@^NF^bfA09RN6-OG-Alik9?)t7u#auG)vYXTy>Mc;)=`np%jm0E@vNf0ODpuHeD?Q%VNBwM*T*MzU=&4qF)iTFx1__p&=X!# ziWziGrF#2l?#(a21X*+qt}(c-!&N*NE9h911<@-#Bs|hosNT2YqwL!T#PfR)K{77>PK-JmY ziy56Q1dnGyINy}!o9A{eM(%##k$hxY5=^LMdd|F_o@KkOUIbHG)LQl8rwp>6yD zJvvuJ=ZWZh^yoZ}2CvS%sq=~$pqUU}mu5UTVLa4HMUhrM*Veja`b;INROD4(v#ati_ z6~6t;6<1cPvqZgf=ja6Z&RD(EKquw3cq>qf)F#@n%zX*Y9$y^9`C}XpzqlwOH@`c! zr9Km`tFci!mAuH#=~;!C%nED*?v|r6L>)_y|$C;a8occ*lNH4{I8(p0URkJJz59X=bwtHg=8= z#}2TYym6Df0+WofpHV)raO{c24i;9P0RfQ6M<(iu76n^GhEikRh{mi$V`fHS0TG|- z?6_Zyxw<=O9~8f01jWbGi=y%OilV0U8I(Q*K6(Fn5(9bJZ1S-fE%Eq>&+(luToZBa zK7;R@otCPG=ZyiU5q~00T(ZH$+0qxQ5UQ1`k2VLaPn((&4jG zOCFdxbd;4&QjDYnoN1O)YJ&(Sfu+7hlVNg&S|j_?(8dGfG^rkluF&B2S%A&Pf7!Ml zn2Cj>+G_ytvX^^g9CSYeA+N9fx!l~2mZ-fGhZ1LF2a_*q-*Gs+><)6R;@tcwH10xW z1v|Nw26kDazIlkfCzSnY*nUT7*%I=*hV4rL8HZ;dCl{^U>?0Q}2p9qJs{JX7%ny}g zmWp!sqN0+zEX-DMU;+tc@hp&6MzR8~l_?uf!NT+Jr}n~;XWSbjC^4gMc*i_TucBn4WF}1$3ekXLst0U<9X=y-MN)*JF4^;aQj(3#@B8&)iN^=6ULG zyl3e^&Je=K2EVzz&R&x4b%0?*t<1Nf7DY6oXuy1YbVgamtp=w&T68EPq6Y^QZIbqW z4~V@)U;3j1z@TL^u1eriDld6k!g-@}@Mq2{>S3>D8s^7JH@d=|_)yhDAhiUj!v!)F z++uA){b3eRbmQ;}XvE1;iB2eaZgkSgq zqh^6keN)A@oY$Q*@vgjq(>m%}L_jd$1BrOQ2XAAJ(mJBdUE#sla@VO=iw}}~iT_|X z(3fTde)DEvo*$nG6i1PVycM;&2OKd_KDs$6E(#OD4taN#zaU{)lSIQ0NnM@Lm$sQ$I z1>RFX;j)AgsF{Xl!0T*v_lLYSKGfhQyH$Blc{duDqlX8Hg~U@EsLwzwFY!8%Wf`)7 z-^1y|NCeYrAW$qff6N+kjN5uc3zjw}V#rsKX@uQ75M444(XDk-;B^rm&4Dbyfg`xIbW>>1nfz?I<{>mCjUDK?mknas1~M{M(* z#oZFOQ!YRo0?z~4-8w`J^jP9VSH#CV*2TRYA7ibh)T(T#o5EGgjZKspN2)P|iRynD z&i0}DSF5@DtZK*;sz39~4-DkV;2>#}Cx(6v41xoodGEqqD4C>Hmm>l_$5;%;+@NsX83vN}| zJLFM4j`?tIcq!SR&@{if=nhL$9lk(vABW;5*4>fPZ*GaGj?g6}u!z;%@L4rHk z@@h-q11UWDYRg)*sb$BZR{+K`;ux*q?KpU9Z(}D;MZ=o9r36l!z-foPl*V3stgA4s z431kwhV8FA5fvQY6ST!h%4w^mJIC(inE1mSEY^cR<)F*%5~*`JSf~dpIhbe96RG1u z8&7s!y2-cS<%_z4lX~=Eo-djg%!psChqdH3Tb}Qg_kjVN2^bBfHk%7{JEDiMsSJmg z?x%IYsaB5!1_U->Wn~g}o=iL+9G`~ho=D6QoP-6ii9HcD9XpT5;~T9Mi+!9@a1wrs zX=2Yd6`g7P0E(wQ6Xy`0?oGoYO14!2XR(kHXvy-Q^8o?kw7l$hnj;yeV=MHp)m~;9 zitC%WuEkY`YdWsGaQSgnk$3jEiUV^!Y`%q;(9%ay&jNd;r)lj8fW?E>mefb^y$!hH z0vmgpmXuwN>XuaSeKOxG`96d1v-m!n?|0%JUP6mMYlZ{LO42i}8)J2`B&|%OZo(hh)fPR{d|oYk!3JSMm@+AH=D<3<@!g>Po5UVbm1(*oqZe z@4KD=6Fz*d{6y6GD9sEJLpA2fPqa8!(j>9=j@uHhNuHktj%0KH2tC?DbuD=f_nHM( z*abru*p)Y+4KGzUVvpkj3kB8J@JdS_qsV}!0RlT1CcDP~Y4j4PrtnJFB|vhmD;tzd zh8jCuw5i}@B7a4~HB?aGW5+1`?H z?p3~$u@-!gXLZiloez%+y4p(5V!7q1(X{lX{4~#_%${R`V8I(UtK0V~M@QsewFYOM z2c%1^-s^lN-?Mme)N+;;0P?ZFp{?{BAgmA&Y5^g8I=&}$CQ-NrAG4wlUPLnRg%_|~ zURGnQ`(?9IVa|zL;K-Qi==~+~>Q=Tt3)%i8g2@IgTnmz5Kkl-V4LV&t8e<#O4z`vp zuucaTE?@#RCZLIJFh*5Cz*0$LJ=h58hyDH}#w z@;FPe@@}2e-)_NB6HkXH0wzZRbeZzHo}on9iVT~y4EreqsL7}AHMr#GF@?fsStlr+ z^7HuEW8fgx0V7fu2DI$Jfrzv-y5A{vVbCuoleH9Z-qhfHNN|u)V&VF?YSC=+z&;s8 zknz&-{Y1?U_C-9n(FFm_?tLY0l$0Gx=6Wc=bi`{V%Ni2)ufHNU_~ z#0DfO_%IB*vHUy)T7o?Qy;lOrUfG(CUbjIS z)Pq-<0pl|__(0WS1s@2Jq6ZwPL)xL#LJeh4$Bbe-;1h5xsAq44V+U1KTERybY`uzx zOSTbyky^^wxJz!ZqSyP@E&*{CZ#r5oC+-A;^YNCg zS#;j-1K16r&5@Yo!$)XnH;ueH4#pOH{2xSmJegZVtvE&--A`Y=R8g=PQR3TE*sl`L zgzCa5f|=K?q`lm}SHDAg!|E+XXpHaG?+OF!8hQ0|g`_se9)9?nq1o;Ve8Tb!g4D>t z6`bN}T2{#B6$BV5IyBNdR&R+8jg2hG|Eq=6-eb=^JRHU86?SX|UdgT^NMvQTH58u1 zgDoEtE7|~&ft`W*#Yq)IpbFlNUMpo62)kD+S0xYbwuGKfRQ#6@c+zBEDF%( zt7j;ztqRcE+j4{h>kFYip6J4q|xX>D&W!1(UCHmwk*6wXKeD?_o9vTj7 zF6ZkHDH{UauKI1%$a~Tva0c#4JLZ~bd2JDLpm*R7%+Sr#XlZvBB8pBbot-C?HaIrH zj9f(Jc5doyQU5yJiW%|4_M)D6R-k*>x?w1|*oKMa8`0Bg_|^sVS0Z!0o;ecFK;}hh zFH!cu`Mihe3m4g#E@2@OpEu0D8*Q0`6JwbhJWUe(C4p8OTqbrJo_+yQMk~3jdpZNJ z=lRbqx)`n3O1R3)rX!6>>YTf$6K+5VKf=QU-g2_1y0~jTM#23VZ6y$;6Ts{sre@b z(}1&urswJ(C};;&mIV@m|3$&91p^kObMSo_ptPt(gZ`phuz>jdi@&)1yv?#|G%70iS=;tA$_xj90|S?~rv|J~`0sc<@0iYu8_l zaq$f`2*9+8^7J0gwMh#u7eOo~bLt}^_!BMofCw(rg7ZZ1?^~O%SG^GEqFbG zG?zm4E?mQKeFxW#xF+Me1J?pv+#kd@mFi}SRovefBrg_!uRQ;O8x~l2#;jWIV!zzr zz@mIhog0Mx3@5ROuy;`}M>-JMt|2iEiM6fJD|Rb7$%gdD|4)1$|Jp0e3TA`#CB!FG z5~C42S*{;jT~mxt?Z!Oc(brU7vO^K8*X7`gPqU+wEJf>^8r-DAeK*dl@xxdxf-}mA zaJa#pg-2yom=7oI9E!1G;GM`4h5=hSKY~iDRQEN6N)Cz;h@vfOJF@xLQx!T!{v&qi zSW{gHai6za>TdTfO0(3>c)?nn_6=-KsGC$=p6#~WK`5VDu^(Sbjz{Fw{4Q>vM_vs`UCGPE?=Bm{K1NR2a3$ z7wf8_J%&X+joalV0M5qOTa&?-d=HcOjk!pz7)0s3NY9$5#~N)NV+!D5mde}gKN zI=GJgC5tTZ?9tS3Z7FVY^Hm;Y)c<;#;EmAU=40#W-8PC1L~Nd>zJm7T)RbVlmdeEe z_ijA`wID7Kbq0=Fy^UBL0B-Rs8+ZNua^(}TUTGj9GTJC(9Ej&(W}*V@zUdLWQoe{V1>D<%V zb<>Q_C_;P6fr%5f?v3uj#BER7K3JRT>=LU5LD!!0!nK%n_jIW+oO5_uxpf$s_ zqr0Me+xJFy5451@9?THC(z;&+>QA||KxgAgn4vkl;SL3meD4)N7m1xa-`fY2e<|-t zQ;py_?@#u0sZSMJEy$jS?1f$G-u-}>vj_9S-2)k&hefh$H;hRn6>CWVqTYoh1YKPb z-1ByC>e{?_({3~hLOHwV0b1+cEqhz{o&ZCKfk&Nes@dVGB7)>b>{063(^+(~>nM3* z!L=OTp9u89mQJEbZ>|X5Txd9#`Z3m-^}z0d+mH!36;hk3Z<&&)rt??s9!Tap0pES~ zMq~wUg?i!6WiM_7H}zoG3J!Jxb40;v{yA|Tq40~$^)7YYmB_yLIHgj2=OCl#kgmwi z7_qnPm)Q#z&c72i&Ckb8b@1Sl6=<`=LFe71JmsE6f;gdqfgEKpBv25Lw1-CR-l)S) zd1K0V56lBdBgeoTgjhUwU+vNo^!ZJj{Cpeqgo|b_Nf)ilWG#G$-f_&zv2;m*j@2 z3Qw~0dUWR|owlw>=MjEy0bUTuz3mXXOM!Y>Ad=SE9*AZKy2m3prV~A<>$W3!EkqQr(@NW(E`N)Y8nqJ^pS)}q&{lpq zdrwy*BzupfV~4J)wb7mlPKpF4S@C!s>r{-A@j=AR-D&&qj^rHWvsd5<(e`&xlG=<7 z3OY3KHxKXmoUnIPB0qbN?DVeU@&U&MJx&m!E=(g0nKyzfLhNj$jC+MZECI0oKbA`n;Q#lfNzgxM< z*>zJE`9`a2!WDSWez}75>rF25GZBLEG(@7Z7Ull#&Wah~x))}z8-)1INoRFRfmlmt z20}S_YweswG`P_u`#UEQ8*@7kcTUQ}OI}xLWl}M2eobef=z0b+sxvOi6+#y$5?ch^ z{LYvFHin3dOGH4qGi@0xld;FZ*W9jjmK{Q-Jd4|)+>VDEOoCeMVmB?q`CUt>OW|!4 zQrH2D_dM0qv~lR zG{tY(8y#qYQwJTrxa%Hw@q2I=!cr)X9?U?{)n!EsB6BBJdMW!jd*>D-KXB1YptRJf zml@|or6`2-ad7dX92eQ!PL-qBJ!yqtLioP!-J8Od6=P389QLH;BdT-L-Z%zUP=kir z1kH!Iy|J!2+02GHF8PtapM%`Nn{kKo!5rOA*Np%^i*sz@~X6}(w6WeZNJYz_PEu2TB=#eJ=?VC1*!8Y)a_m3M|FfbLfMJ_42#`h ztLV@EBcq(Ks;U)lR^!PU>~^^+tMXqHEeM7i+)o2Qb*1_UX473qch}~lIGY;}IlI!{ zN8`oQyVCaIsrS0wQ}QwFlU?Hy_67}A81s>ZYzOtWqJ&c8p&SOmHY8GkuGuf<*1xID zabg3b*#G9u>N=|Y{7z+q@+O>RiGVv3UX_?!U?3D_B zTOl*B{|fB7!y67?4GSE&0?M6qYED<#GJ0ajT|v(*>VtdIHll7C9AE*ZMfiO$jWbz$ z(q0mwRu)&}d_m-F-97MGyg_JNb`N}7yaC$ofxp3fSNraPk5k;?-2;R4Bn5(+sn-)! zZS`ChMK}AR4ALIO>>(YL+b~MUxz zl*4#t<0_?DqTKKwn5QE%mYfDCI9z)L_C?Wpk8;|-pGrqR&Io*XMds(3r=uS_`CMeF z5~9hZG^L(AsnVqRc;rZva$mM(*9d%=zo?MeqCV^Z`m zR>g<;4_F|!(YON$LceA1$n5YaJC%0-{s@9N>5HvI8J^6|o{kv2+n&sJoL%N4&NwrS zE&af@)YIfrnw}yw9`)faFu6xylBZ!(DNVIs2$jQGR6XM%kN|R-JAhjfDhWJ*l#WUT zX2&>gZQzoN)nP>4Y@@m|z(M70B_@~`_~44@2Lm$qWYX$gsnYZ`BTNQB^q>TKqU*cy8@9xSQpHL zx9NAZ1CzUet~%hhl5Uw#>SAiHl))HY2)8dS@u^&5iARf>1>UKI`cfM%=~k$VJZX}> zUsME}`s{qV`ho!UEjlS`gBr|cRtdy0>DC$2R49UCX_B*FM83A!qPSDHFXnp7%Ha(!J4l1G(P z@qpC!>duc+SC($QQ(#ahO)Zorl}VGb`^CW2d9?m)sAQ8uNsMcRNJp&CZtUW2yqdbP zl;tot#t9>swA4vr{$Iu3g<*rBWP_Hi+sQ4rQf2{xNOxrQbr zm~mkH7NRQPf6a&gbuxN%nH8o3?dht(_*Eh|F5o3pT072d#he}`Dgx2-Fa7O*|M%Nw z`(`rPH>2c+H?TLAOd9aGY`SLN%q07!1SMzJDEMN9>+X|m;lN?7oQd{iC_6E(!VZCP zlKDAQH<>kO365`;~hk) zM&>vuU4zbSe6-)D5o$-p`3XYNh-k{p9l*++L@bXLfu{{Z-N*q#i9#F!cM@SU04iH* zBsvj0N?JHT8VoI}4Uh>+lZZU*gun{=SZpE8 zOfr7*(%egp!6`u`2B%aa5mlN&Jk{nIDw7HdbB(D+r=pYQmLAazQxHjpDTpNMKqQTC zqi7DYSBXnE-78J36Knv9*+>G3L>ovf!viF0Bk+YuWEEuUq*@Qffe~dVE22JnDB2N5 zteHeirK&O%pN2K?*UVYqPv$J}C&YpOJUpOb>R^2qW=Rtl2BL!mi6DSB_<#Vy90XM0 z0RprEygvdA8RX{qG6Y~KEXJ5+ed6P`!7;_8lJ$I^*dusr~>1A@R$X~ zu4(o0c?bhrLKE0l;sI?H=+PRYK>2A>UW~H9mDRGQ zlE=FRx`ZdtogvWGyanY>2^g0be{~*fBP|4-h95&wiBYJxVkQ~4D?SZTpv?M~_{yqP z)2pm-z*<5QxRP!HYu!Q+2-hsByrf@rzb=PUR4bvIuIWrxioj%+w3H2X)|^0+umh5$ zTYzM~hGeN!elH^lR9zQhD{DunM07Wk_Q)iIDphr)jCW@32ppXXZ)uR0YRY4l&3L3ooer35PgTNK*I(^s*dSVd*INp%y)=`Li6IoQY4sU z__rD65d;&4ztNY_k7mH=2cB7m;SXaU2Kk*Z`e|GDJZQVwR#+30VX5DVA!ml%ScQ|Z zw2Tp0KSo~=5bFVfBlmP+HD~orxmXkE3jES;sabO=y5`#MYV5G8ce_6M6ISM3SOcW} z1Xu^cBac>iU}<#SltY^h@LH+K5x$4+pzUS{Ro@fjF8-Hon8%s%8E`FMT+RBlJjs?U@m?i zj-i%$)5l^0QvU!d$>sh2IEjheE}$T_C~p+BKlvI@$!MXcn0K(^SJf~PV_Z67Kw}1> zLHJcopXPO_kK^n}JWah@;6T71z6NC{qr!V(v{m3e54F*_`&;FVUH zCdcS|NcaglrbVovDN+0|WM*{au=;%xzUT<=HG(Z1lhCk6foWK7nJ?l9@t=$8tqsL!TRKgMkih{ zuP#2tKa1!>W;#xiO9vMomzy0*m~tW(m^9ky^zmc#{ZwT}7;~D(=o9cHq!f$KyaO$l zNSR8LRj5#r3+@jDvz2WHBEkj;BYw>_!$v%{^Rn#)WnntnS}5=d9LOVdM*4t6<~F%` zsSUsjCO6u_jlvOODoCf;1N-fn9Vk_nT$+lW>g0J-VF4Cx1Wbx8K!*(Ma|sB@z{Cqk zHilG)9Ig?3L_V;;l%sMwP6zfoGuv^T1=xVt9C_(QH-NXRmyc>FqXRV0`OCm*{ARUa zLh@$|fnG_6s&o|L3x(Xz+NF&hG5+LPRsbJ;198MTxw!_`lMF7EpgiuzhYyMK9UbZg z%F~A^YtBC$d)D{fx(c=QY(|7d>t5*Y_ZRasrsqsS!7eb-KcCtERmL^ zUU-bt*+6X^`xG)xFy!VZh%Hn|t%iRZIk7e(7{)1JHWh$`s@HKkW^DHV!eJ0*2sH&W z!=dJI>PF1I6+ol4DT2+3kC7Y_girC4Z#dIQd16;O8BTzx&6 z(m1q~$RO#8(I*#4)JUGy6_`QA=zH2Q#o%h zF_6`C!shcnN?gt*HX6;ADmdp@fKppd7o7J<{!&^_V~ec*Dm4+U_W89!{>_r}TdqPQ z5Y{`lsV+GWbE1Y{wJx~2ub>I zWOWTRy4Dqp?owlmy@^5R{}&P|t3!dI)-FPB(4)9rSWZj0y9?z(q8h`-me_vAo`tuJ zRf@z^_Q4qi;}DIJVt{Pq0iq7e?@tJ2BdbpW9{3|!&MW|4qEUObyG>!?QL;cT0 z4JO$Gb-JFOj0~~HYeY9ABSUJZWZnukJJi3XWj z;G2;eyMyIf7jn@&gaE7;7vPVxYAvi|8nkZYcaDg(q{O zNkoOh+lUERYVQ;T|06X8I({hEs&l?X4Ixh|tF&4j>hC$x#4(NKvN|0pu@@6O7ftw| zoIk-b1O2}GklgSHYY$mhMX|;{w8^C@_-U7AuW)II)pX8W1a8<^LH8vEQ-U;1*#~JI=Xvv$B}YN}*_Z(7j%*6vS$Rj0{*0 zJrUBkBhfV`v}AKhYC1!@KKt09Bz~>je7(9JS<#O8 z98(1D1z6FO64?o9hdP{cU>2z5phg$Dj8>prTL3s&9%AWN_wI&&O4QFYoL&Qv)@PFj z*&E6F7|SKiJw_jvu1u|(ND#WK7Jd-Iu2y8xX-LK&xvy7W)qt2N)pF5b6dTNdlGRuj zKAxE*6=K9QI?x(UH*0Ici?pKNfGlb}-`32D(L`w#m(%4(o0jOrj!7iOeqTTgcBsBY z90X7l&>M$|dk+}|VGK1kj|=LmN@$o&0mP8Dq%r&`PAD6snnnnk(e)vVkSt>i4{*_B zYJ?KKJCPFGj*Z>a4A%-wOAWJ?m?5n7V4ip~7T2qfB7=#c2G^6Awk81=-*iSpaH?*w{0^x} z9R}9GTUQYmNCkkYP)CLu`Yv(``(;cj6=F^ztCuBei^HN3>ZlIJ*#VJ|&^C!#F3Gb) zrSsYsBt|zqj_^m!%-v5^EOf*hNKGZiaUo*JB`b*eF#}CDxFG+@RV7oCZ6KQ%43oJ2 zfEgy)5Kjn14Kr!D0N0cuo6)g-8(YgmLvnw;gW)BZpp6c)da=3sR0hQCtVWYTxy-1c!)c%lMRpAS z=)QWt!O}O80euX;HsQ(8*eQ9(%SA!Kd{hb1zJl*72#8 z=tE)O^G(dsW!B&9!E?o~Y*ZWNyfbw|k;~Z=>Z4ylsq5X8yFWFoyL*K^f=02zU4P>OmY9ZUkNOSJ}WT6p?<9FsP zJCm}+B0O6$3IAbEH=(09#WP5VZBJ4df`FHjAokX)zu|OKcj#YI@smJu9G|3isB;s5 z4b#K$(p*gF{PN1Lq&5aIzyxhcqIw)({xLcn&n9#}{{<62Nvl!|oS&(YzOXtU`c*JGWO4J`BTkMWW!|Mpj?d*clK?~8moQw6*Bya6EQQNCYygW%THObqYU8^2VBKp-IIa_j#e=`Gy z=g1I(yUZYxCaV=liEUtosqx@C&YM6xNltGz*FdNzv7$g!lVtV@LD;{K<(pDsldd2E zFcJ8vNKBd*$?88i*3@&UDp`F3(Xp#ov+Bf`sE=^oM7wE(GpDFC|H@p0iGIU$xDOfn z7NZRAA-xAAlfTo>&~=W*FV&SSxov|fnDsvfdi)MSG~xMJDv>eFO_^T*Jm?R$ZI zQ7*}YL!ARqv2SufZ&}fi-a;-zIqGH@$%4WOCe->@?!!^Du2w4rOta}Rp@*t*sBia9 z%IBnhg`j5-mF`;z0t_+HB1v89Bnrlc;j?pnnV=>qTh&hm!~3W}R`1~wCcV`^d#GV_ z_KYT^K4vS=p{}RE0S@%bg0s6X%mN?dl3>A?7s@{~RD%j3l!TwbZPV1kkjtl0Drw}= zm#Jb;bH_2MA1_z%Wl<|IbDglbw&V8I;b(KJ*%xL$fopBNe}yAt0(pyG$h0n1kOf%L>pSV|IGx z^-=HpTryFwMuH&*>p5K`kq2Qw=f16b3P}>pSk*!G$?9x@QPS`%^N{??5TSy9iyW!L zpsqAf$Mx!IEral7MRa#|Y!L&{C0Vn7xVi)xto6if)}dNB(L@6e7%bO)csu2W3G6Up zYz=c+NYONZtw#P3uGmiN{9*1qGL~REhJ6J&Oy0h5c$MtC&r-* zW+7iBXL%einrNUd!3>wc(y(!~HkH*4@1pnI&OUMH<4hBcyP-Z z04GAX4%vQD1wyO50W}giTXFro)Axi=3kjB=rw~X;%SH`hd(C3tGIt@F*D7Dwe@v_ z{P~<{!cYv?R}z$ucmOmB?O4v7z)wiXXFE*P>vJSo-HYhhUUp$>AY$QL#ymhEA^iG<~ zNxeIT$%fsz-7Lh(Go{)T0{YcOby#3A^ib^FX9U)v{te(`A8?>wG^Y21#=D%B;A4_* zoy3VI>FA%A!!#sQMy$6wfaZ<(K>)(}6at#fmy+%8lx+xSGs)bBME>N>kbO?J%(J^W z=92o}DU~Brq)k>wBU1cKX`=&v$mw62#i_34MO?o_eOiDqi|&s&N$Y!+=4!~P((ibaByDGo5d{wQMu3PN z;6QI_OXkXg6A7-QQ?aQW(Yu(bul(apDx)ix`;{{l0;>mB{pdx+qJGV8~Kg`veMoC$nCQwM4 z2^f`-Wc)CZA@u$d=ZS@Q*m9{o6VWQ1wo#&8p;jSPITdh6(N!5OlI{&uT`AH#8Os(GN zjj3YXph$G9&iJVal0kjF-$M z&A!h6MnY^3Bcah8=B$a@g?4$6^4$O%$e73c2j@%Zh%ZpfZ9KP07+0IV;#}wCMj)^; zF}qR+r{HPKb+%B>Rh*OhOP^ErI{GABiTVt(8Vm(n*q5U1B>DhpD4p1NMw_n9JBiAG zfXQJ&E#PTlwWAQe9Y@l2GhE2-!8&B{Kl)%8K~Jc z$&eG6P=j5s?nMN!Pl#c!U7jVBqt6D@fxi4Y!!S3P8|Pa4Y_JhY4QAl=AV6q*OWxJ> zeMVT{Bq%oAX{E#-wck_ajGmrJ-xsNMliUPovDwb3)Ru}jcGdg@r+@|G5RLuo39Ez- zGIYR3B*eZON6mdXkLjdsiTcNs!b63amfPavHBHYp$sW$8iaE}xz}j8715AklduCKG#g7*Uq+qWcx8vc;a^-8Lj)txSd}(>?xfU?BegH1c`P_% zdlf$XLI-Q*#(x80(&5ONFV(x<+7VsKXOT8a$B>hbdY8(LW08{&2-6R*a1^}S!OI92Xu{sx%MPK8dD372`#mQZ zY>XB18rYYH`)CT>{-t1Ok`%DskNu5p6^B~JkW4}?l9wUbV9BvaG8JFFHm_!uzr&Dv z)mEKkdnOxv`~FNPMJs)gSYO=*zc1W0vTitfz#aI@J5jXk%?}`sY;bmxeu@u}g+6t4G$F zcmbe)`DzGnO+mO{5t181a8Hx^+{|m?UmEoX8Oa3d{nnD~c3iSww2d2x#(v5HP2-+; zjZ(fA&|7$Az@fegykbQhV4y<6H!8uH8*kBSc~T&1?xBC->F$@7 zhaYpziKa8u?-gcTztE2^HHA5gzi5g*EP4FU4cxAmAqDfehdR_Fpd=RJHO0Qs?_=q6BLEmu z`h{MgtCO+NXB*Q2Bt_i+z>_%mJD9sB!84{jSM)AKGcd!%J-^1(E|BH^yJk`!q0JLy zTJ0k4%;CV7X2@T@5<_}xgdcNx6T$uWw1$<8UXobf1Y_{q-!HRV^8XNS5s!$G_%Yy2>FK~-)&P+9x#6WvoeeG!7|I^$UkFNnWgFWGRv>- zM%}lSS^oYX$oHc%%Ui!Jvvi}bTL3qXy8j<>-vZxMdH;QKX&c(W2@s%awN-;wi&`lv zSWv2^AVTd0S`ch?bFnh!5L1L%AT@1Ga!3J1rkgVT>zr;*ylhm|(WJ!|5V4f0+y%Vs zKvD4q1%$lc?{ku#G~)idyzl32KPSKE`&@s|{rBAa!N0p<_f$UIO@>)%zVu94zVzix z@HZ=8x)b^;!oGY)zI5@;`O<6Pp%nVFVDHn4eCcfPSUVf;VE*hqcy9XV`O<|8@}<=` zz+doj1N`2F@JBoIrRx#5tHI}U;C_vTC2;k$G({6`v4xD_^>{CSQ6Tybk#Vo>9cN6X|#p%(g+@2VtIqeHH%Q;>wqPiZF&F4mThU zzX1Pt!S08MLueA-J48A+B7MF9Piw*VwEOa6wU%?-w&qUZcAL#o0kY~J(!j>*uq7anCR3%(-{& zoH_Tos^{H5zk1$+Up??Z&B8^ChA(#4KIo~dZ+OV-_4&PCWl5lM>9RoM@`oRJWW}Q^ zSN{63Yaaj2Z=ZN_)$e#8l6JosUV>ROo^J>5NyvbrbWZ{w0GYZcAr+{syxm|0#mlhM z&B|%dKhl*iO<_}5X$y5H;4xlPICRRG@}<&k3i2PfCZ9;=ZG&NBN;j^5>Nc7>`Jd8) z7jo@*d&G|S5Ht!kF>c7hV-$8zEAA%(#FIm<(YGX0w}-aBhu0%g@e~CwqD;lbaDa9^ z47Hzbwr>$mbn9<#-`ryz_ad1(LI+ZWgN?g`bg=h8ZwGr1;!!v}7quNvhe(KItmCW} zy!h+JD?td*cjNc+lJIG~p|+!P&(8K*USNyIw7;HtFjV|(zV_UE3KaPHUVgfFad z;Nm(IQY4#=Pe|ah47+$3I~8`(7mT>u({j4La}j#9yH9tS@X}xH331`kY)9roXcil( z*&mi2a5@507z>=axD0xf+*I>7$>l=Wna*6?OzZlYGxwY7K62AuW#*H3#z$`Y$cfv{ zMmT+`)IF-W{wj2jIdgGsrPDXZNbRqCY4g@)%#MthR*iiooywF)C8ux7G-KC!a?^*J z%C6afrTKUSar88&uV$JNX@i)!aPcG}hlnFOI8HID3ngKJF%q4cNOa89EyiGffst_% zv0%hlEaavs#YV)=HBXP#T|XA9Y34IWEAdC8<${ygcqMjaMB{*3gbLy?ss^u zROGNIkTi-dl+&!$R-`!!z)@wyYcxT@d>_TKUsV5VU7zJcluQ?#^~Y2toOR+|B9_U1 zJ+bZA6I&}{+m8{2qGnn@Et2NI+|ztyGiXDDfH@%6M0v?vNHs9ehNo$P6$2zR4yH{3 z`;!v%als&NnM1>t`!#BPn*88d(5$>|Mulg+4YNROd9^>Z1S}yIU+q}5B0yH(@_eX# zwG;5$Ry!KM20ZoNV}E(3X3vZlTb2)_%_6h1JXOq=r%4?_arm|?sO+hqA!QAdeKMi>IBad>AFPvVA*L1BV zYt{ZUq^xeWaZEVu2hT^h3&*(sjmeY1AGv9}x*8$KYc>Q{EEsGspg~A0b25fb-xG@_ zAy`YpNd7)I3coWdE2i`2La?Va98SRPFhRL)9|A2c=Ofca>dx0tNQ6m|+Vxkc8)*yg zL7R(}?dn@JT}hpizyqht)#N`%Z7c5;g^pW_)$SLgHk9^~P`9l}{fs)om*P-3wOsw6 z#|C`8xwsQ5g9w*9&#i0|H67^~72)0B(wqkW@k2fX4+r>RLid5xy zoDOtUwhI@CoiwA@?Sz{*;~jRq>3gYX?GeO9auq4dyP?Qk{w;p*8{@A_wk6^gz!rl~ z=p%PMYbEGNu8WlA7ASI;oAGYa|}aDp$}s;!WYg z+>@?z=bevdA@5IXZy*!MOR2qq;oG3`2s8tNsbroHanR!`}TN#x` z23lUMIsW1W%`sDwj%ju7?nnfqjP<&3^XVu4cAKOWnKeEM!ktQY&aPew@vkQ96?k$@ zOH3_gl|dU$-YO|Kn32|NsSI~0-MxJNSCjbt-$XL3R}v#8PcOrp-5ynP@hQRT!Af5@ z@WF$TWlW3@auy}pIDw)yFxLgE6TNw66tvNJ$X!#RNhzwD00B$A_4Sjy zM>bLn{dwjX-%$R?48w){eDZs(`t3x?m9X~q!xJUNfFuof`U-3j^R?^w;C8~=XWu|- zYlcdp8EGeLRj=WZt`97~#rY3v%BD=`msj zkB&mt#H)Lj-3R&BVigi(XTQB6^;0wq^}&THIYB(!jod}*jG-*IDB*P>(nU2lKW(+) zv2zAah49^?^z(!axWRXl!va3|K!-*1nrLC-?gWb!&+%TR^1b8Pt&$XZYxrI*Op6Hf zhXHCCJRNpP~P?IPfNiCwie}m+%^rlHU-z$Lc4aq zn;@jTA3Bjxdw_tNQVle>nu4JdNhvMLph>JLN8~l%4`mcXU*J+}6z$s2h}P1O@-oK? zKHO;>?!Y78mxfN8AJsYvyV0C2IgMV)}2SsAq1 zfP}ljyp}ZFfm@hu%?xQlGM|NnLh7>Swj(&(VqU*$i#k@|7=50-1RjM?g~Lw^e~Kdh zbiyCI@WLMBg;q0h{rusP*e=p>aX-}r`il|Zn8kty_90*WS$sDx2= z*EJmJ38O@giFKnZyLcCI8s1xjCVuEoGW}_n!uZ4LWSZIYwxRYE2chzkdWw+Zc5r*^ zvI=ms0N)CHtMNsf;923Sk)Z5XBWh*H_(ZB)|=Z4%(QkCO_HHK@pU|E?CMjdKBgHeZ55IJ z0MWN2Q5+l@+qSA(57nNe%ut46ky?FC?dc=%; zjCS!{lCyU7A_*_9EdgFP7C#tfJC$L7bow%TR8<(0-fg5VUha1K&IIvHV615zOpKTc z=kWLLs0KpeW8fHid|{}r=R3M+rp~Y5HSc`o8}0t+9ws!4Mq2D*7ekfGr-dDfA&Gxk~txgP&PuSE}0Q_oBd~zp}JTBhYAe zRiY)Dp?>vjRR2i3G?x0~tE})@-QHvHp|U}pbr_dxUN+07hBR%IQVZ%6@`-`E`oPK% zv;-WQQIjo&(#RpBvXVnaUn56!$`*(%zLjjh)KS>ify9lgsF6fMeKZ?TY4s|ZfTEB3 z8mW>(5W`?k-F8JdT!#)v-15IgeHQ)E(}!W;Yp^rC28N0hXm3b`f~CimDaM5D4QbHW z2iDb>aU(H?gQ5NXP?C{^hDJK=veybPsH0i_5|-WTI5w1AiCdqehwgP8Bnn9Hrj`fR zjQ}kVyu=ios!8j?Cr^e)qpsG%y&{4g!{#EevJiIWB?eYz8!^5p39RJUxC9xkoE2Ef z0dt8mq-q~nu7Vn1suY9XpclCv=XBN{;K07Ng?yGME6IA1B4S%qq6`caSc}4)8XptD z$BfF`G;lM(@Ss-=b-fLYMT|5V8PB|q^fCn2O@iUt`3UZtKLyqe1Fvft_BVgZ*;OUE zlO*pdCW&_y{ZR7*WEZ-nMZN|bb&N}yZ?;Nbg~hju#n-orrJ}uor2_Ga6la67rDDdx zPoq+MDc@+o)1KwZn_|=*c3oA52|2U{W$N4L<;z1~SjyBlq0%hKP2a)fPdz42Lxl$! zDrOnh{vFb=I%&sA6cg9roX>NDQzJvLswYlz?gPU?)O1@^x1>imw!YRL=DX~XUdvbK zU`aw5^sFOyQaNPzoosmO95xu#2dgV{!sYDSsy3iP6{+_lSs*gmtGWL{$*%s0aSUf=JGbW=ZNih$WHv2B0b;ZN>uV zR-zu8lVWVrv)Ad_qx4KT@T?zOA_94t`U_(M8KCx$aVn{%UV(gv&Q=fPA4J;p$1H=o zgQ$m{cY16htfE;)(TPVbOX`cgEU)UZTr_K;x{N5|t)xEK%cd*FrldM`n^oVUe5zA> zEQ=T#)cjuduh#9)GOL+AmP?R+XUEvIsn!^ql6o3rT|H_?hI&p(sln7F3nWik!{r3`jAx>si4f($?n9=pQ>{`p2ndNK5fQEMj) zCr7JBnl&fBt6rp=yW<0au@=Y`kw9i~oRsm*%e0*vZyP(gHQR=WZKW?G3m0k6{Dm%F zn83*r5ua5;DL8#ZC)t!4H#Djz z;`i>)sCQ9RPegRbEHvpF3#TtQ6<#Nuk9 z`ZSW36+MZ0J4$bSV$SYQz21pAAKQN76Z1}?*E=zbgkJB&91T6?y~=}Au%Ch@g7TUu z53fOt)XKvptE1(i^5JNCn0i*UJls4rS{@9S{;)i}YxrRlF2TZhd=%>O{6%~e?x>_* z?vGD76Ih{^))!wp1rT?)*p%X@| zOsnap7H>h4l4pKAV#8ZzQHssI&HE^M7Tr8qDYo=BPf_x$y17*;w)Qsf>o2ysTMXW^ zeoCHQwmmozwapIXPvy=&MTz#I(MBU;*+`TA4svhYtG}moh z*dHnXYY6-90<+;|S(qNTE=q1IFo!iLuM7F}vlHDRgSXI3^WnkhU>@aB_;1LR>mNcs z_#ryE56JEledngjYg#;NUzZhQhU$C3krCn{86$&G`tuSnd3-UZhwFkhg`=$tC(7%B z-YJ$ucb?hcUSPIXk7~;sAQ8d#Xk+!Ib)ByB+$YS{12DCbmx#A8eR=)7c>^L5HVN;| z41x}{#uLA^Z1&|@@O&GdaI-}mc=Hk>38aMDrQL6g?@6y>PV6iF`~~J>k>cKbhpaZC zq4H01r1-aYeypWK-L3^$N}_)&WX2-R-W1qdN_!ocB2Rgx&!rnW4<+w3LLl}QnBm>? z7MI17XmBI}R`^?IOxL>TGs(k{*czGf(U)uep&im_aI%aH~x@MFW*-#gPW z0Cb=ib0km?@=kIL1|HIeslFs=o(09(2{1VainK%+p9{r#X4pxGB16W{`APV>AO*HB zgu>AmKSLAnb5S3-yBLbhe)zd05kHqE!-p&=hFS4*nHfKqTj19fP-N4?E9v2I2A@M; zM=;o{Qt)#%S-b{{kz`;L1G#n(esUSoXtFt`4}Pv=jIM`b?0NXfW572I#?OrmJ^yU{ zj7!E(!2s|v9*PNR__>M9Otj-2z1sy(}h!C1kafTuvc3Q^{%> zBUw&1-`N?JY`6**_=T-Rm8KdMJ zil4g}uc}e_xto!jbqRic&KSYX`OyHG1igp0)@aPT?`6=RT>ZaJJ2N1r$8S7eHt_u^nXBSfIb6y4(PL>KL`CiXcp*m zpf`j50W<~ldC>bnA&*Nrpco=ZrJxvpNdrM&1pO)KpFuAKeF^kN?+V9iP{5Z#7J}kL zh%^TDRnXf&vC1r+3;Gw(Ux1?Lk}d;X13DSB3A8Wh>!8)3YeBC9eFJnV=$oK}K;HuW z8R*|Yhk~vH9S7PBngALET>u&a9R=C~IvunX^eoWzpm&454SES^8|Y1-?Vx=?H-O#? zx)JnB&`qGlpznb82i**M2k5(?=Ywtm&GSCtcn=h?17s2CR?zD}J3%Wzw}GAq`ghQK zK;H+w9F%i$g`gjT_5Fxd^Fb3pS*a62 zr-3GcvT}3KSOwY#l$AUgbOLA!C@Z@abPi}=P*(bWpyZ2e+CVu!b315%&v5TIYK+vw^uJm@}X@XB3@FB{ql zjFS6$sd@k%VABvLM=SA4X9c=ktOG!eNjk0j-CQiM$#+=%Q}PU@{F$H$+(bm(|X7~LDgMZ1qL$H_wQNb(Y z{nY93+rMJoLFjphP&cASp`?s+@K&)$hhwzc&N&r!1hHWUz?-NR5@ve~3^_r@0Sh;r z<}I*dVI0xrvVEFI9qa0cpX$MtZ3QM1<3U9d6`+R7Xv{PbNXRpAJ0^&7Q~sLa{(O0j zJNsq6l31Sxl3iiyx)MJ}3yh2X1*YnuW+O!uQ&(Dyrfr0gT7CS5M)&?CZ=ne`;N;6Bjrf_J(ui@{dlbNw(5 z(likWXKH(FTiyFj$y<|K=qWQzDYTcUg%DJoitI$dPSZwb$|k2zmMV-)-&Q4Dv^rm! zifoqN#_6V&+y+lHyi&;_a>}ay^MGS@pa(ai|;#p@$ri1Gd^6CRvb2Se^|6Q z$PckkLU~Ai6`QqDAgrLT8R~Xb4?qQjFrV!0@4>LZ{Z6=xf={x9pA_jeH>TFrXRy$X zT41)!bfgeJqT}R_uIk-bC8Wsgwa^D=ZGn-;848R}%;~P0fxTdn`GDcO=%;}`6i0kW zhL0V0I#Q|+DJWBC>u!ZlaQ}{Qf0J|vidhG~1h6d`|GU5c-|h{O{23lZ24V1J7VU)Z zI&VQ=Z$UqA!60wJU~j>>-h%VI1w*|B7kLXV^A=q0Ex5{CaJ9E!jJE(b$9W410)>;_ z$Uv@o4cLZBr&w`6`GYTe6myB zhTK3~qPN5vgG$IZ*3vfCDwPH%Sg`-lHzBoctli+7kkK|a&FGtu**4Z;@=eH|+BSBW z**9TiS=-nV3BCzq%L7H$wy~oVeG?`G=GX)C(*n~RZDaG30uv?$s`7osV*^FQe8ok+ z1rq{ABYeeEeD~&8`le6v-90l1@t-|LGg5!Xf5xLFhr8F`FV>q;@$Ja>{VDhX3 zT2gsrZs}QDWbP;lW{VD1MhD4=q?zx4+uSFb?@!1HqSXu?GJ6h~hN65*rn=>nQ=l2i zj?FT5teX?QZ^Cjt_6gjGO0xMc*e6g+Ya!L{*_Q;%N-d?A7)W6y2JVZ6ViZnC;Rg8h zD86U$y@rorYT<=Nc!}~u6xI;tTYtqV8qra8xDOb-%T@ILcpCbU00#vK9Wn}ZD1uA^ zbw!X_pu-V_<`$lO9zlsfAvMVXtuLVEt^E?e7(=*8$vm>0p5I(YT zih7MLZNie=1fLA>xy4^+p`X~6>GTOb-96?PMB22AA^_1yYOiG)NKyt=`-CbRyL}lS zUoA60^E~PUYI~s2+@4s}jHQ6zfm5u@M$MQe(f8p;u-$HM7~2<7ZEn0lkd^r$Tt0?D z0hHJ}W5ISG3txp7YUCBv-2S6&8XJ1#J?u`y)A7{V-B$(L9mH-i>cX!25r%Fsws8ZS z`Y^_AP}p_^5#R)P50FalcW>O$3UvnPJA3zwx93;6VZLM2-i`eBhM;HLv&tJ`=?4L2 zs8`c(a7J&`yAkS+Ae5PM^U8^Ew0k3VY*-ka(6%9<&BD{vJ*(z3pm+9e!asvXFmrw^ zn9MyZr@>6^qs1zNA*gR*RLW2ptAQY$x3Wn_t7_M)mvq;cVmXMp}3JM1JjQAdA~u_P(?C>%AM*ov;BDW?@CIqa>mV zV7{}|sXWf~c4j?JOH-Z73(Q?-)(cwhx02n*@o;+1*K+gQSziO%9xulx)Du}Ja!)&b z!kW`3952cXj7OoZWwNqDU@spgB6B*O^`Fa6wus$EhYVQxhFpb}Z&V}{aE1aW4BLa* zNN4>nS6-kX#uvNr#vR6k?%{>xIGz|E>C$(z)X)u@B9B^agF z0lhPoT8yp4`G(S3oOKUlDL+&`6iWa&OqR2&_5ihV!YOU8KDC%uaECqbgq4aHiDiCuJ+=%B+=h0i#n#n#hXY~BnbGrSC= z=)S=6>#LPe##|{^QAY!c(88z`nkapm<}p#)vFS$`D(3p_Z;xlculVR*F$cD{3XC`9 z-B!#81^rJy2+D0#7JqFml&AzLEuPcant%6YYx}h{|As=Akj6-`bzdL<%4zV*Yqxkr zPzJ1M!PVRkA|ZEpYZ*Z3kR_zryvymcx0XR^KTsM)b&VZ1gln5k0}6 zyas)nye1^Cc?TuP#NE{?EsUAQFU1_}9>jomDze>)>Sc5KM1LRYO`JZ_?V~6xL!v>G zoftMvHwe_oo{m(imz6!*?J= z(Qdz;?Pt?r>+}QB!|@#D zL+FRPp(!K@vJ&--42$>TdrLRy)Nmb|;1|*!#EuNP?l5Yv+#Cc1k8&et4ohoKu};g4 zFX30)iYzyB;uo80Z-;(>lgzbYP3?zTZ~_6=)Ty-Nc4@g= zVl0!kYT!)*eupLf^XOX zq4|b>t;e@@uom%IH1Tq?ecbkU#!K>Q6ewK$e@Mk9GtEZC+&pf3JIz}|-SRQCfMWkU z*mp(kDO+@(giXz-6KV-;=$?o`=n2lb`5Tvrr1Ig{(e2*f?ca)Rj>tdErFBA7O?w>U zN0T@S9gb>R%FU>REq+l|G2fUjH@}|} z@{4*5Kga%!2dJ_R$<3&gAgfihYJT-f2G6i!(a9=3|P@}s1~Zyu7qWnm9y1#$_;aXRh>m1 zo9DNv?uhmXrk{Vxl{k4V8X157m5IsuSDHPoNpOv@h9Ka<>Q-1+wnqen_2yGzJFp*V z5z%@DTIhHoDu}i!LvGv#LrjRfQ_*KL3pf;iY+nGt{P zhM^@pa|QQ7GP$z9p`bKV=@f#L!YB~25vNJEA8qf5zpPa z=V?8jThHKmT94;x!t>0)1e>$=_z_8d2;)%hTCjWbuQ3E}G)30(?RcNtbSjL+`+*wI zFgB{MKucaT$K zoNzJ#+Y1I#h{)s_Y44oa@Fhn~Y3qCbL^!L|(|h8U~r0*M&OLLy<~iC&)q z2<);!jmR$X9Z@+7KAJvO6{ST)-!3emHS`?OkSdFY9@EVFXvj}=dsVWAYBaMH z4c$XDwyLj&Zr9BEX{ZFq-)Km|Z-aziwqMK&Bh+k*B3W_>=opub}>x&LC3JcUw36p#~{{kLI=!F%%~|_O4JW=>pQZD+43KFkw7n2z>B~G28|E+ z#mxT?{1WU;(AW{8^uHe?!A=6a5XFwgU)A2oi3+pmyfIaY6a<41v;s?6G~}ioMJUsv z9BvqhqJk|vC1`3{&R++HEX?EyEM-~IEoZ8~)hwSMwXA5C8UNaL79L1dkusaD-b2gS z(i1JS6~HX7yeSg{)Xxpb+@+VGso^-#vp%C0{iCBaXP1yTR|Y6Km?T6sLCmM_3^FY`Y?P*TXeC)BTIH%CxBFYaDa#_dJzN8 zeL}nDV^r=8By1W4q?r&m8###&7PGrJg^{M5favr&1 zaY(g5D$2O;E@eA7Fzvu$vJ4FIryWHxM!)P&8}7oL3gSkP(4iE0_4}bOQv&uAm_rYk zi=smaQ*hgfqpcK&?Ab?KDGyD_HXLoGKr|)WcC?ie(Uk1|@GuqrLbyTx7$EP6drDDZ za^EL=WK&*JK~V^@1;iYCM9dl9Bjz~RP(!|nw9lIC87xOqq#@FF=2b8#@+$TE>xG=* z(9$n~)xVdR*Wou0|4}iI-LUhGBalG0LLv{;T_z>7)NOdvi+K;00J$mGiBV3PvZY)- zjME*?3(>i722ynRnKi?lo>P{Esfb7hGj3zVip|*v!f97Og#yD@MyvZTf&ZVS4+3(CG(v^*blZ@44tdF+#VR7(l8D&A z{k$B#is6tD8Q9O1H*@6%W!mEBFw}KLl}8(O{tcVsQIwSS$B!Masug-lxB3U6+aa$$ z5ei%AsysUU4D=H*?o$-8tkyuIGGq26(0vr5 z`P3RZZOrCB0UKMe{#CA^{cG3aC$2 z!U*ys_+#k1`*vgPLG?p7!ZGBTqAH(AC4^;H7sD3HL*J4rztB|gAu~o(#2?^gyGaTTQ8-86@OccArVP7Nl5@0IY^1-}DSZD=SSzu5a zSZ4<*FJ^nO;2_G#nufv9PzEZE^aerU4J*8`!Hw+;Z+s zxMfjM#=&Fun-PZ!4e8KNJ&^)lAsa^=H`1H|2WXz8ba=&tk2YCc=@mVuw_!O9qw}`^ zQT`}f&YVM9o@lwC<&wHY{U)`G!s+{=IjxH1GXQ{j4|+znekW6QZ{Hg(vuA$)0i>;m-3@h%aAkW2iNm{w7vOXnj5VtK^wx_ zjy42s29|m|&}3N9xQM$zdYTPx>Qxud5KX}pT4z(BP2I5@Q(b)!+kA)KF#Z%8tl&K> zaoPl9w0+haN4C#s*n(&rPdHP$(e#PNF|Gw?0~(1=J!N^aT%Exs!l1mW1-nqN$Oy@# zw#5xu4&%TQn0HM@g9`2tsrN*r5I@qr$0IAZw;)oxud;MtU8=8yUv<^3a4h_%`-Rp7 z3WNxa$XWXwNf?j%3S3mx5N+UWYPAK?pW^6KQuUD5z}*Rr*nS~0y$X5B26-u`6WdDs zOIhpu4~faYul!5JRO>E(2bQ%Es?y^BwU~m1AdB0y{5#|(FQ+DJKc=Y@^K0L5(CT&# zmYdz2lML;%ArH}yF+aM@kU)XkJXk!UI-nhOXF8$|67G(0LAa@Hp&hwiGc0G9 z6Ss3L$`Uu+bUC265T^*8yc1;6r{YEsXKw2vYv9IkS5i*!O{5w}->KfmSx~$NN^5T$ zAl0TBG$AafN3z8|6wyDlck$g3&W^JO3anzQuXRkN}@r602q`zP(csi&IxyX<@;LtgOIvB|DYKOpCvfeS=>t710;O zmmzb>NPTc0MJq9?jA<#X>cj-3OTHtaM}!&$4Ok>sMG?6Sh0Cg*Pm7Zr3B^@)TAi{% zBSzE`S%k|)#j+{&8%Ncw5q?ld>{Yj;_ky+&xYi%*5ASYO)@#qzc#@f=Z`W$@M7<@V0CZce4n=rqz zO|1PUcxxH3w^o#_T9%PWd~g_y9DT*tD2^1OQnLk|CDpc3yG-2!EeLJ;79tPk=gO2F zqC&IDQM<4x&s&*1k0K{9z2*{ogKTo+v%t7_;T{9-AjRky3*ENJUb@%6_&z*3EZ1{D zJXKpi{(VGi8MAfV_u9N^p!$TmL>N?$=t|V)hXREr?I4vpS2H==bNY16AkP;Gfih!> z=Gio1;`%$bc1Nao3!sB8r|Ll#tanh_GSvH+ArOB3s;A9_Z3d{a!nH6QEbMouV365$ zRm7E=2N&|1ZY>g6z*LWXPG66t9Md8Z`ply45nA0TrvsA>5k5BwtzKatLsikj4oo$c zC_6;JSZG&QX+C0)jmCJ&H>v_HZI31D;&!zL5bO0S7AuNU-jSQOYD{C0rrrS~+6mke zNg^k`yjj!jaHgQ~ZVB8HIfsU54pXm)xbUQ#)#asQ#C+ei#$T< zR=++R;RLCi@?H!lnd*lyq8(Y(;%~*0OE1}8AqS9g*3@cGjGOf{fVJK-!;2ikd z31SjBRbKit4kmA-(1MAn$e+BXb}~x7r`vk}Kx~wpv=>)PXQDI0$^ES;>8%H6K+K;t zR$VUuib?q3B^W&(`~-vO3t{<+$d?(R*%5jb=$MF_c5c8o9v_;MDt51d2Cnq-;>uY! zv&va{!gVRUk1`gah)T@+w;;$5-bZm^%=mN~m7#cgSM+0DuBf)C z;XT;7NPD-W<2eJ^bFXD&`&IWp+R|EW4IVOj#qJcb;j(3n50z1V=t9`Tp6<>2xCg&} z5{UXCrY~Sey&gR%>HTpEosQRdXh^VaUlM$7yJ`zz4P<;{AAa!v>m8w=p zROhHakEqU5?}(_*SIZ+RhdMc;x>&t2qPkQa6;WNLUZJVfhctdie1v=1@#W*2gl`JI znfUI+HyfV|Uk$!Gd`s}H!1n~cXYsv+?{$1F_%`GF0N*}*hwy!i?=(IO(tZHGG<+A~ z%f@#tzI=Q);gbyM>FGv%{4=Geo72-1(i1g^-=y?(OL}^r2u|+N?@^@msC0!jqU@XA zFI`TzrT0%CkUlWoo<1mjaQcw+)bz8`&rUxlJuUrQ-AQ`-d3vFxFjX)Y7XkUW3W~)& zi{v`{d7CT6U$6ib)ao^K-QX{qk78~0+PbcR2{!0E=Z7g>G52VzO|EwW z`&YVQ>~5&VuK^22AUIzfFpo6_G52f==6bW&O_b(NbDv1A&UMxrO+1Xw&-;LWPYXBv0#oU9RfjX5Hg>*>X z555lt89Z7r7wqx)97Hm*!rJ-8I5rF#q`=gjkqYUp)G3SK8=HU8$q5 zb=lp{xhEsuz&+9ycQdp#EW>cf;9f@}RnBmkVQX;(sxt2nvp5+?0{n^dOSZL?I@V=x zA1{6LdmIvoId2`cA3cQ4_D^n}V3eC}G?G_u3LQs!v-uN+?u_OT{i9Y;c;Mb3H{)XP z)j_%WCNl-P)n6&t^{~m*X5!8VD+W(K1Md9A32$RBZm>U4gkO|M9?InAY`J+Xj#iwO zSD#kCmREnRU=p!I!LAMZW6L^iI$`P#g~8ycNVNVl_gE6tz0fNcR1yDhf2`bmuN531 zW{Kr;^L#`P8y7}}PRrQYVuH3!+vH;U8a2!A^bLo7q~b`qd74>XeN1j%&`(}{637UC z;mSlUr0+>U(=n%SE-c@Rq>FKY@#am*!qHfSwt+#>E;7XQRV7@QqnGf;aIEob6YLJq z*gcQzf(NiW->CCjjC~^9OB2hmy;t}dKV|EfF;{*m;x|1f=1dxfuMZ7+u7%forS9I!lSh3H>q_zdMC^GEo-=!g7X+ADZ1 zYkTn9f$jSkq9?Av?AGzopt}* zJ>7Dq=PU@f?&?IRIAL{cdy$G+mGH6cEoMw)1~I#R9Fu-4`n>%2@mOd??;K3`#mkk4KzB7f!aIYe7Nd|#q(SFkZe!_nfw778y9m56;3A^d3M7NL&n%(pr zJIRIj*2(l<>wdCA;4K_ph(&l1`l|m$_^%!W1rH9}(D{WIJKGIcNZ5Cdkju)~vC~{Q z&^gB7j(8zh@NB`3MrkZoYHbTsOhM0=2Ev-}s`H$l(}rqZ1uNDX#mawHd!@782#j=!{N~JB)Q2t`2>1ixp}LyQ(nD2bW)aA?>x2()U?Bd z`L}m^n;_iOh$-TOI=9!f%jr9NMqC(?B;Y6vm&alLm0W+ z>B@I*#Tpp5-n$&;3%|mOpR@jG^`~9KG@I3h!Y236(e~go*>-)3#9TBK^Vv?tK6Nf4 zGzPtFix|j_dqw#=0uk|Q#=>-z@!<8gc1C23 z454x0!l7$lhFKO~v*{x@qXunZr@M(+KqZFUVnt$Y1lzVqqT>=#B>F@rqHW{k z@L1>8<4#P4^1&I~g&&GU??j?!Vv{dyR%i6s1iL@933kEEBDA4=Dsb`?@B^Py!R?14 z#RrlNlt!>&$R%ezY{evh)Jin@d7o2GaMs+SvNntwd<8B|eD(@~(pONUP8zL^j-#jA zkYAQSkx?Aa!>FJL`xS9kPvzamLL|gw6*5F_!r6Z1xcU+XlyY;Kk*Nv3qtasv%!`!w z)Gs5(no%Xvw8H7T87D+^fwUORqg8R~6IeP{K0xzkYB#l1^Wic(>LW4| z#myq|2FMa|CwP(i1m+x&Ocw5CMSsagcV9nI*tpRHkj)u)6o~!EopN)h-1L_LJ9nTU z06e@K3c2}o)`!~8V#t~ZDs-Zc=>z1@wiA`$*Tx`w(vzDtF!LriomXCp1o*SqWnTz6 zE{Jv?;g%}zVJaw9{T2qwZ0t>F?vR`DYjl@L)pvcS3g^5ZRxRh5PgkPaka@PA; zen9p?D%}az*+6Y~`YP~<&OMj}xyJ~P)M2`ZAH-kBoaLC#?^ zrZSL|a@I~fV+0@Zb~~=QhL1aiH|P{J_;bxyvWXqm^6G6$H?|C65ky{ngg%7jEKF~8 zLXM@M2$5`lgK|E{h$Cxwd?mItaXz2xLp+>~hh{2`rMQ)>4?@5;ExAcmD;QW)r5Qbv zwwWta?ZTXiwkOxdy~0gg+HA4)?F{)j3Xf+-^0QIAquDDz&k!6IQpEnDwp8R}5vk{x0mk6z%`uQus z|2{t*|6zV!^zY?oCWHB5enO=G*Yk5&jOBkJKQE8Z&+Ieh=kPP;=ZG`pr!~^vW-#N} z-ad|5>PUWm0VN(=g%Gh_T+tJN(1=TWdH7))jBvtH&H5Hrn#(OPPc4$0$D?i9g~k(! zg8iAW?>Cp=~=1TmI^ zSH_}25YiSUiIGazB?}#5aM6{q@EkVTD83zXlX>dHkh-*v94!Q&HVfg(8>bk};nW=( z@>|dxmM5ZtYFw@Ue86;8#(WT82HY^UW`CNqOi_!l~K$%EpnrzYVMA)~|ZiR*?!BZ>k zzr^Q`n+qpFCj- zO*~+R6lGU_DAJuWc|Z4|H)T)F4%TV9LW~tT<3M1($$}kPAxG>ClDDI|c06P&?m6qKZX$pb2k_gXA$K9P5VI#6|{i}=Vx>NH^Zid`OUrk$4B+)pqO{yq?Xbk5?T1jAA zF-s~&jS$5F>#JB#jT)u$B!l`YGLp@S_DmB?I2x8-IkgNnP=f3t0g}1kYj~ZL9AX>` zL9!ktGss*EMw``(7ha$>HRmlni;-`#YAq`APLlweLTpr#-{a6Hl$8VuZY>HFPK$I2 z8Q@Vn*q}E$xF3zD|C-Ati8hjr913$k_*S|ol4oQXw6yN(EhdvUqso|ju@q?Pl5&E43T2l>{TY?8&XlU;u}&HJ25ao zsT2Fx5i({NLs3t>*%m+)%>i_o z%P{$g&7#h&C!JeQIdeDpU>Qwe4YH%fncGg2t#&RCsPYU zdK`d&OC%VM2jOTx@Ww1w7KpNFMWc-d`ZQDyq|NPeGh(mV5o z>@J)suf~l4P_M;l6NcZkwH1?@XA&8qrv{B6d9%(Z|6Juv{mpU38a9)tFwVzDYvRSl? zsXKIlg;nGT^D8W#LBSd_Fq2VbF=c^3+CxCdW;ddqjlJ|Js0BPQoXVzl7!Tk&oTgSb zoM>x*T#iLrV;d44nilEYQ`UqW3y-ofe+YKwL~_3D9>j}0qVTY$qLXYcm@Th<8!R$0 zH-Tr9@DjWtty!PYLiI3uFQSeHwSd!H8lPG3J54M#CT@+2XEna{M2h`T3`ODN2^mO6 zyATHKb0$<;heuI6EHg145-^uD|r^~;OI2O=TNMR+4d+ACiB zHDg6Y$#WgU`-2G6l^~v!_2~~fL+H?ZKPs@lz~J8s7s)$$QW|b;bOa~HUGDwj{`8<~^y4l)b26@S!13u0+|};h zZ%Ez&*8{!j@)}&P?*7D=ZFjK)3!Nzn|G?@$RM9flUw{#5EIpXz#^0bI#mBo_s5>(R_N`wB!?I` zy0QqLVQXiHigamp?{{OTb#ll%PSSQ<+p!JDgFRzfA@6lUKpUU&5$7~B_vNJG7gzr0 zd|n?c4-}>bW@e`b)-fX&P3ua*{$7p@P^0XAv7ft@Te>Z531@;T)*3wGNL9rv&x{n_w4pO8w@4vOTzsccbtRk z&oY5A@^PlL;rg;m1wbp>f=PZH)LDKO{O7h~MiIA2hSXH=^0T4#)}DjkidNj`4;u5n z6%YzI6Kn+hQeMi&Z|>XWi<87i-br?wr^R6E&fQk?KH~oQqM_0Kw*D#kwjhf2l>GjPy>~?- z6C}5Rq2m1O5*+pAxd(CI@?{Pj5nfMrV;T@#JZvy%?jg-*ijYAiUv$$0brhkSby=1`k5u;g8%rt6U$3Jv)9vy@hoFgop3(xU69L)O$yjj`yJY;usTJPkOd75ajC`EQ<2p;x5=bBeZRKTFFA#M}1@ZEo#u6WL_Ab{o zo7OY1Rh{X~XIw@CD1B*wD!BZ+bd;aafn?{gPA3itnVq$pBrNEZ8HH0^taKC>-1`^9 zF2~BgSZ+`PK^mx6s@|PLTpl3XT9(N|dD>}!`tfoQ2$2vab$88K6 zGk$Y2)S`P`b{m49gRc(XWB6Xg*B0|>(!gf1|3Mth?j1kG%f+70qKJ^ZRxWY`mWc?S zNRl5)M(rpIJ06{2Wh`+->L#N}VY)7sW;# zveweFTy9!m4*W&DQ-~04%6q)4#C^cjd7$!W#|4SFktC7s$PIGzYiH;)l!p(TwV$y( zY+-r0*Qg~LwoXTFma=*_bh)1=;o5MrhUl&N>p_U{3O~r52{^rBuQObFdP}t2)l5YW{ z()HjMfhpNU&7T0qmhK+B1emR1)Vv0mS8qh|Y~a*5oEC#8!8`-l#_;h+?1;mead=n^ zhEn19-3)XV-Y zakwZB7sug}I9wWsr^Ml@akwlFm&f60ad>(h#v#yN{LhHPGvn}WakwH5SH|Jn*8>I z9Bzoi55-|`9Ok*6*!IC6hm|9f$uX4nGrzpN+%6kHgQ!;XlOT z=i~4TarlpM_)l^8#W?)uIQ&u^ULAusLtc0pSjZbjO@8@H41N*jug74@FK@-*CBVTL zO!;Mf44w^~8i&(jFvIVNVv`pB-(xVt-yVY*{_Yse@b|@FhW|+n?iD`#C+-O!cr);k zsC}~*{b^QO96gvYK>kCN}FhfjB|OiNuLIP9jdyv4z;8<37ZFbev3_tm72o6di+i z$!gVcU*f(x?nm5D$1<_3V;iwe$Nh=>>v#b1038n`9;jnGv0cZ5hzIF-F!5j=4Qd& zI=-Cvavfhme1(p)iL-TlCGnLy9!@-5$2r6~IvznhLdRDTU!~)#iLci2HN@BGcqH*i z9giX&rQ>UfuhnrbajuR>6OY#M7-B5)gNXWk9r1NKzMlAc9gig*tK&T4JRRRae1nc} zB)(C{`Na7;9!ES*#|6X%I%bPw9k1gF#1nLU6Y)(to=7}V$2Sw-tm8?DWc=(s4C$wT|Zz&(rb!#P{oXKJk1VFCbo^<6jZ~ zO2-cnKcM3p;u;+i9w82X*Wr_UO2dxK79Q#PvFE zAa2m{L&Oj1*h}oyv5(lNV?VK9#|p8c<0ZsPbQ~ZK=(v%%QO8S(m+E*K@iHARCtj}O zhlwB7@gu~K=y(P33LQU6{HTss60g+puZe%HQf{y=4{6`)CiTF=Cev$Y^9sim5&pLjI_$3{$CSI-Mmx*82@hily z==fFQS9Sav@oPH%3-Moc{8!??>Ua(D8XY$gH|h9w;@5S&mUyj>-ynWN$8Qq9spGeZ z-_r5li2tVJb;Rp*+)Ui8;~;TR$06d7j$4RZblghZs^j&<>vjA#@!L9XBW}}iJ8`>? zHxO^o@kZi}I^IOQNyqOHzoX;L#G7^eF7dlM-a@=Z$L|rpr{fOd4jpeL-m2qH;!YiJ zBi^RtzZ3sm$L|xruj3DhKhW`q#2@N-JMnfM?;zfxYbiAKN&Kabj}RZx@mIuO>G*5nuXX$l@i#jD zmiSv8e@FbCj*k)_)$uXnV><38?$+^f;^R6#L3~2TCy7t$_6=)WwNz?W6jyhILl%@2{5;R);QZalkL87Hs56X zN58P$)~Y^q4c;32qFovc&u(jd{n*{(q-XZEPL$dcKEdxdw~vELh3XZdItM1x- zCR=d2HNj`_6`MD<&azfzH%^e$Z*GC#Kl?;dsx7%!b>CMj-G9L>v-+oeJZkRw+4s2W z?DI)b`o?|IKJI&LRSBzo5OHPPCu$fDTVeHiFgG2n%*KP2r}oJYv6n4X&K(Jc%F1(& zj=HL5dab0Ks!mn6mEtC+^VDG_ku_@djs!TJ{`6sl>ghIA_sjjlWmewqGUWuv7ImG6 zhd`@SrmCd~G`DSf^^n{zs!ciJ@t$_s^N%CtWntlQc$;zrN1`tpmGIciT4|QG($#mW z`ey`GADmuY+m)n#cop_Yj8r=Wsl=;~Gj400sw%KCU40Xp?P6IlCkR~>hQk@*WSA7gt%K4||xcV!YdDh!K8^T>9MlH0u_O1nci*rNm;||}1i2JHlU-drU zBttI{E2d8evFV)#=H0vg{^z3Who z5|f3*%=dHd?1qH4@AK>LeV#8o*_pZb+<)hud+t5wo_nslqb^(La20IUUDOAJm;Hlx zU}3yR$MWqsR(=mGc3@cs3${_U=SfMncDOQ!q0c~x(a%-`KiWCvynXGpJ;#+#Y?34I zFf561)mhXkcf$h#UA{#RCmsiIfe*ZYODSi6gN%onaJV_Q8|DPU3T{-;RNi78_jmXp z&A*T63Kl&KhLm*6iGW*fyzF-=2u5}HVs{@l2ufpGxzdp4VGjemr`PRV@3nW zf&KUWoDifWqpfBP`y(i}#tN@l2Yx{4a75oj8nf32(EVb;P;}RWSmWqkoIp3a6&Odi z0_p!8-=6}h{{r6!R$Rb0dLQx~ex3Bk9xzFu$(6CJaiK*{I@=VrOHh^4zj7E*+Vfh+ zHuSVjYSs2lw%~Avt99)#tM|AP19&UJ8aRT=F#rT0=fmz)gzB%$F3Vn!>^X} zHl;V|H+Gje6zRKOcKdp|bFZCEp(i^l!+?b4;1`X66NqHwq>s=_#<^OgVIG!G!&coq zPTlO#aN*<~#7jKHOaAj_q$oRW6f}UF&ZkDilc$ z$_q^8*T|vC%QkJK5(0f*b`5YcnERk;i~bj6?`4eyL}jm`vh$F#;DlOr8ifZ0S1%Ra zgvNhxZK7yCirDKO-uQwB{Xwdx!*!NJO79mm%$#7pzQd{?#!#lgC1r4+yiP= z-^__}4tr!E)0+N>yVK*R4r6z2qO2YIP7i3qTgif`AQ1RZcqdrCrOANjxox$|X~5CMURVqtyYTwJz6Jj^W~`wCE&;uA>mH*G>isg1TKp2=ZCBM-=$jp&0l0&AViix${tbLa*4oa*UX3NpfAQJU>8FsZd)E;qRq zuqEO`@DbW@%pgg|VKd&bR)--F=+axz?K*^RzBeD#L;vEus*L8AeVH|*mM(AFu@6(1 zt6BO`wH7p(_Cu7c8Of$!lx)2HBVs%PlN(f+q9p+lhbW?njY6ZE&|o4*2OAM5Py|?cfF%(C z&I;c86-p!G1fwNZ``__TFDt9Tx}np{Qb5mMHX%sAQ}}xpxU`og@sO|4nO+tFp1o{6 ze*Kr_qqBD2LxhyOlSYB*b2TvoP2>DqP)^5Ajm!O7yvm-tAM|0)P9u~v_T#g2msTqs zTdI}V7U`(T?3L4<#~Y60K<39d3-R%4?&yPV#Q>|5W`7h7A9--X@o~ADBe(V|U@KVL zh!$>9+Q>ahrg8+vkMUSDyxk1{(4uD&K+j%+mUkbABve6oVLi{MThCbkn)OI)Jb0S zj=3JnD(1sq9>q>wMF=;tiV)yokK;>C@v%}=fG->?G`B-(aH#ISmD+f!qGnsUlRw>p zR^`y{>(lP;Gdk|r4|}ntz8~6ijSir%oDOoW)UYU_#ZF&~J2v+^H_?XdFyt6fQSgVj zGu`dbitI|qw^&cZs&u7>0f7Rl`c&6Sj060`v_To0y@xFOP!IU<^?-HuVSY8&OqAV2 z_0;t_syl`xw8H&cRgMIO#RkXBz9x$u!qkPxEOmyTMEvUsBDi zs0|3@v{N3rdwqc$%V7txqN3<7R7Y9WZfS9!d=BBOP~nQI}3-RTt94@YiQiS9PiP#a8a1W~uJ>h`ZgyV~d+EYXdF>)qPNd2;pvH_kobL zV30!|i?|PZ5NqTcOOE-_`>p8OK6oD-=nt)`UA4s#rl)C%j5T*F7HiZQ6@7&1QlX&C z!J6U!0J(9zS4$%h(Ne^(wL}~B)p|{h6+yW83^sZixMaNA^oTw#RAiKBAYq$7%QG7#%1rQ8^rT3JBT)r?!EpO#4Wm z24ioBJia4F1WIelkyl2TSNOQehypuHf7P9RxzccE!TSfu|9V@NHF(O8U= z5sSE)Nk)d8U5;L2x7Q)tRxJ^%H4a&?qo7JJmNP&mA-z#MY-@J)uNPb~@sa1zS+(c* z%6(#jH;$_GDxZnUr=qKW`3hNBzM?965C!zK*w8{b3yX9t)s=I?+AGig685aQ-*sEI zYb|e3tP-`abtoM+TPw_YXI@VR;*seTkLPZDZZE};guf^8H|cPFN?j_>iPSBy)|Vt9 z-?{}!@GPyg@Z1j$281F#$l7dYd(z9g!{3jliOVY=JA>yLJUj91#Ip;}E<9s+#_;UJvoB(g zpy?J{r!5vohh|WtXXCFFf6MTP(YGA(-F9m6;CHk2@etH;2u6U81Z+gQwlA`&urJ;T zxfePi_fQ?Gf|4sa~zmngIDC0=#z71pX5=W>_c4uLBQLO;XQ`G9DLN5*d`sW zTVTUk4ayoP0D-+f49c477KgdeS6={<_d?wu$nAsR&;qnD-e+IflrO1g#YeoD2M47< z-V*At34bB{ZN=Z?_Y;)iV zR|VSyJneYehxUz$qc-H%jz5OKKFT}MHzhV;U{GK1Z?tw$KcH=ZF~f%R9VYQMn#AA2 z(m5e(3`h_V3+|mfRMsei7R3}EqhEq}yzF^eu0e<(nMVx2z{4H|uktA|L%Q0_9x~ti zrOUnS2YAQL$&uONhVRuP?Q)9qDIF8)k>fj)XNBDSEn>W{sGKDmF;U zaiCo!%$>rl-vplIWuvIwv`X$I^aT+P{vJLd52xv+5vPcK(Su-8fQ2r{QNa$uwU00Q z8iL}BBr*JBe9)5mw9*eH6J3{z#g83wCCP~uY#o1dceq-_(9cnRT$go|x5C2~L1l*} zDHc@8kPr14UN(jnO{g*C+3#rc`$}ESYm>BQ(w>}Ve}Jc~3N{J(Vg5(zV!SE)vauGI zOCe6D6m*xUvO{SG^TZn6;jK(8yh!6^=9zPGp35muL+)Tb5F9}fiPiYksHqa@u*lb< z-PV!|nO0m_&n-f>T1+2F%)LrLqrVGr$=9R>PKR+)-V<7k#sPkyk>W#y-ZvwTUf7P;?Vm0n(3R3-NWKGFE(HNvgHzM=*V1Jq9g| z>z(yeYdQ*!EbaNq<#w(c$3_DvuKyysV&_m2FbIisp7>u_IaCScSU{q+3Y!*2Ewpw{ zmD?c9XtA*2^GTVmkJdT!&SH&h`?!K#4sruEXf0SZB$R&O2j0pW!MA5NgvUsrBP3KnD7_`H#_E|!k`{f=#= zxK*MH+QKfXBKs0lbC7!yh)br=EhF6niKUQ7CAh=;5dyTBtKa7n9|@s5w2$*Xiri~g zzO}F2=w-hJMQNR`Z+z<(?xxchuFiEBR#=EMuXTFRuuS$x6wBrC(UB4-g6EsT&%}eJ zg2vt?Ph|F!?Duz|raMVIM!IbF96nWO744PmKX?qU6Fda?bli1A2kl4(ve)FWG-O3$ z<{E&}pzr3H>?C+Oxh5N$2xSUH_T{8Fx)beZU(W@1Di33fKT zkO=x6K$<$0KLM>hxLp}q$5LA8VfiI!C5{&rEY|LVoNX#WNXG>M^h-$9R<*<-5BIW@ z$k2*4_9`bjgMIuxWMAS4HTWJBl#V{Y=vlbMdjziR&Zz#C#g21(CE0YI$&`t_YzY$h zJWNJI3-+Ulm^;KL8gJ4Xmse4vg4C$-XjDN1wC}P&IxW(&9GZ}*5?9f%UEspzWc29Pn1>_FDCr&sO&=a9DEm8%QjJEZxU`WTxRNSkO`7 zZlZ%ix3EEk|C;Vb@T6*ZUA0R#Z2{!ec$xS_hG1z|5D)9p%3`+0x* z55)2Nafv3I#PMU-0C9YWXhA2M11-?|_!Et#7>Y=7{D%C z467gMvcf>7G|u&&Jdw>r!56kyD%quG!8E2xrjxT>JyHh7P{ENN*;(k$Tz{F;Ye?x8 zmF3KbyX**|J<{ug05-e?Vix}kcVqRGI2=|r(5ZbaVO#<~T{>ssPOu&0>)<_h$QKYRyJmB#g4D-mOVf=1zr&35ZtYao{Qv9iy3MW9a$ zbVi>5l&h+1tzQXrS)_@4PpIIC>-hRKt+7Y$(i-(tt%+Wm^7iWKyD^ZqxY{=)X-zIS z%J?x-V@8Q#{kI&L^RP;llL{vC(5r}}0Uml9FIIOful)*lpFY*gZheGD_{0$SfT=iG zjIK7^u{tYSd$Umnl}Z=fWrRngILMjNU!&g&x*<{Q)}mP0}>z_kPd`}}Vv=%WB_u@D&7*LXb91q8gB4nB-^&>*bR^Q;`pdESvf6Oi*O@ z5PeY?^FBZaaj9fv1OBb^WLqg2@o&E6LeCn5&rGz^BR}H{W!l_~lD43r0b7vfmdG(EW4!EdM4lIkFD;m76XMIC%y%xn{1@H_ zi!Z;RxPK+SJTfSg^@B30xhRv{|3xMwzI-uyXk*&I<*29P;>#p2+xSCtSS+zk>SaYx zg`zjGQ`3bQW#72OvOF=bjl*i4b2KkCJTb4Cyv!lxf}u$hH8~Sf!9;dHiszeK@x707 zv-kufD-&GrNgu}fl%vq?-0-dzaDY!a<9rIkHPAJ{s$#^dVthvrW1klJ+G0oTCv^B; zy2j*IxR(0A5T4*xAg4a#de(*2E$2`e)p;LV1AY1}uBzDDTd;4F?q%z4=gTiSpafzT ztyfAbI6{0WmUo_#d)av(+Ua2*ZY6Zk!a};s)uO!zPSt8H>&rXtYFX>i0$utQ(D{jb zEKpDP-U!ebt+KB$pyLDMfj1L(YztK%m9-E9n#UQCGy3&Ke8Lg!NQ8hl>!4QXjx6l1 zYlu}8$`0uYVivg|Lpjr2#pEynOu@vk$r(PM&U?9_f!&W}=&Ve31JL$#eah%G`WjAieLMekv$8HMTy4cy@w^=N=K8->pPj&6= z+%4EgKR#`#rPOlVc>3dxpFcESnX?;POBOLa4r$*QiL{Z728bllG59_)?REm)fBYK` z96NRVxS_wxwjfh|?62Vc$Rd9YBNM?Q>!;dJObZ@ZXxU9YIFM-zAO~g28j$Jj37jR` z`-6X{z4M}{kjDV7X8${B#i&Y+{2bMc-uWMiHw7~>-!K2)^dE8?sMEjOe@GkezegUs zxc{ahZ`=9h*Kl<-2=q3NZ^5217>+_u;n!rYDbAYJZO5J>sq_IN?zPTh*#M z_9^ZJR04HYpBSD7B69Wa8J7gswXwQzqO`8YsPsnMPkJiYgTE$@jG|n<(rCpPMbgLR za)vn@U6Rjhp%@-{v_H2Kg1P%iucz*3yO1IK0LnA{5+s}I@B1VK%jV`dIiiA&8&@MKgEhDNhn z67|UQ9~-F0Uw)aWN0wQS(s(^m>V8Ir8n0M@&v*q06KugRc#7z22(PiRuYZou7_b-m z7=<9<69hnRmNS$&{=Ew=kVl#k;opTKIc6i_mw^@V<3*H`qacpOcdw>^Ok+kq(hY$9 z=4TgyyAc#Jc5L;PIMkmm=76p_#cq zrFPT4b-bA$U&Rq&qHF*ge}0-m2VrBk38uM25&MFu6E#Cw>+U{$-}ZPBXv;wAw>UQ# zRLDdBw2-A27gAw@zdSv zz0@;MUFXGlzGDJkgp*%goagiLJbCAQeIdW##efed@*6@*zKg+bGr|0e29r|3#ZXt9 zP-g9GU|iLU>ie`qpmQ_K!=e-t3At&6dra2BtWOdG2KC9OS8|M8G|cyLTns|oTPB!4 ze{iLKelgTj@yz6{Y&GJrX678h!~xFZXx1WO5$tBEd-g(9z}*)gw_QsmKVHx2b=W)77cHA z;ybZPJ+K~wr1fvDr*Dt`^tu1VdJJimGnvQt!#e2HZP2V2!-Oe=s(|GU7S#^+B$SL= ztB01=@kMnqyA5HrpI9uNTgaUvw$AY;hA>xI*gc36LyzJ0S7vB8Uf~c*gmXVJT!EfC z{uMKzwhNxK%1OsN23F515=JsgLG^EpN0R71d=Esf9vaCOhxyVBg|is)!bZU;LAK4) z3qES(YjXW<1PvGDPJE{#H~p1@{raea{gY`KpI)5nl&Nt7`x6pVleMwI65Ea{6v$v=~0#5!x??pW)>U5mBOlL>NrE`r42G z-a<=hdGyJQBA~jzkwQN@&cl-W8=FqGn^Jrx>1?2rboHo#7zA(ZA<7fjZ-C31QOmg) zujaGIrf@pZnxhL*$%>j>ZhPrv9Y@gkDhI~7>tpFkZN42ca{88$o9wRl);ULY8{*e|{F%Mh#DqrkL8N4Da9eoFKrHvYP z_t2=$+;~)6j(hX8GPgs>z6LDFH)7 zcaFxd$IILUk)*glmQsP2eF;rEZCFj!%3%J|XKQ>4RxNu;d!6!>)}D798so8t)g_(r zykJ#F;bdfV0CgUF0Cm+4SJuqFwSxT+O?I`YDFGO=%~qQBDN8yHH3f0lo~vN5zk=$v zLs^1^mA3Xv4%Eypub`HC%w#3@K*peSCH6$ZU_7BPkTBa!I69tCpoG~<6XOMz2$eO^ zL88P3Na*@NYu%K$1t?!X7U~dNV@>K)D|!s;Vu$L@wk{r5&~V3!<@=jlA8h%C6U>(Y ziWCc}Pt~N}(bEes>;<7s-s~+$Y8&qZ+K@(Rm}o4{#LiGli8CGe)!*>4Ij9Ri`jE7o z)S1xEO@ii=_M?0~ZN5p^cjR(#;wN~nXx*sbxtw(=;&0oIo^R6jHlCjt{AA+MSQB2f zy+fh7|2qMuz0UMj{5s?`jB9((C%8hdqURGJ6}DDAD|0h#=G!N>qjw-GQ5HSpLU3RU z2;1bhaV5r7gm57kc{rr<0iN5jnX^<}W;pTq`2ogQ0q8d{jevD}FrK3xd~?PtUuCK+ zCYvgY3Hm|y3UbgdAF9c~(7_eOyM}O!fy}#+U{L1lOJtrG%Ls9qlKtg|T{YCm8cKqx>t8%DSB1hSsgtGCJ&r?XMPZ^3ELP|aO zFz^W+y>+}p|I<)~&-+L;C@1zFa=IPXwK=rQ3_Cts4%Q`PqJH}X$f5?aVcTG6?(;QO z*J6?>vXtE}7wnjgm)hO*>2X78c6oK}?reOdTjkNpZV7M0*AFk)Us%WRihWG2k!@cr4901hh4y7N;wpxC6 zQY$-&D=<3*ZArUrugcBScOHb=O*JjlvyRdGoL2m@Z!j$(ci2={u#@Ak97Fj+%{cZt z!hP(gMZ^dZ;AAiIfOTc4ZB-we@;!}hU}lHy_MnB>@0{ODI}uzD4=G_~xQr<|Q#jCR2MWEJdTj}3x9gPv!pfRA?& z?YLY5V^D&O2kqu0(lQ2mTGohmL`R|7#8?XUyX^0-0kKLW=PBo=t^F!e`gi5rhz*XK zjHOMQ{ap!BP07XR(wgBu7Y@NpYJ|+)#9joI0fQ;K+i{?xi3dHA2s&v7IbhC-eL{Y> zV7V%=2+@Vs$#DIJq2`;95{j_u!!!Xo z7uhM2pJL*c9Zu}VIU<;wR#RQEX}RNusa(9-Ht>eK3mm(&lhOQ~H}4@k(FjI7&`@5k z1O!Mrq_&sF@TJg^eP~n}R4EP>JLY|`snthB+=7R#K=WyB16x`gt8-v;n^@7nrXKq( z@QCGWQ`mrkfRyQF`Z!Rz$7}2HvNl2;9kt_WU}8?A59VoM$LT=yrW1=dnldS~F?|--5v5!d1u{D>Q280G_p$=w-C%k%jeb*vr_QjM|c|3J$B$ z27VfwOL<(bzYz>%Tciov5|}grPW(j!j5=mb6CZEXVzzg*MmCEmB9N)vFikrvr!?E9 zMb=r#E_ySrYO>Y~b;Gqz4d%o_j(U%MR-(jK zZW{Jf%}T6lEGgPvd=I1VVexNEiM2av5IjeOSGN_&~WHVjL$**W-$<|tQ>Q3A6@|5nl5e!EerrzrYJ+8(C~E_n=>RB#_Uea9?R_ zIm2OnA{5Bt_PUAs7@`FCu?lR}XKO7OKTh@m`VjIjDASaCZ)`OTKETL=W9YuLX+4u2 zw>Zm<)744r{Tep3h}dR6&7k+9MKF(m6-*!#CV$vl%wv}zY>-^i4Gzl5jd5~2O~V>O ziWB)@OLBc1Hv6Ge#U5jGiUoxB7ijQ7Xml)2OC_801$LarjAp)JKpd%R)HG(TXQ??8|zX^yle$lIpAavDHZ{oAkZ!S`-7i!1RK}X z3C%?|OY}O#Oh#RT1^d%mC7zvDl}$OKmKSovb!R0#C&r#o{@P(m?C8m+?-U$KZXI{h25{aFT2qnJZ2>XI(npS6gneWqn|87zY)Es1Hk$EK`rlDo?kwApK*pX%g%czkZCo>OR9 zpJZzSGgI#Cv)83SkP=^NwKqoXB}Q3hHJ$uG-=L7dZ~4cj@_(M^-IV7X!Lt6^NQqG| z1kY7V$-#3a;0%`hQvC~;+aYCAaG{(UY?_60zG?l9b%Ji|FT#clsyYIFS(EQ&WA_p1 zI&3l>1qsf?aZ?SvBHQx&=?UzvK_ydBi4yi@GmW{)L@$$$=DE*Q_{JXI=zxsVv^J$V zC9gyuM!ntBe#z0E4_!yKejt8R?&}OV22A7HF%{*wdiVgiu00?951D&OCr&6FmD9sV zHci-)42H6HG!B=n1l03!D1ej@4CtSrCKA-Jwb_6g2B^(Lpwy~P%DB12Y9X2=7JQn< zL|oJw#K|)ux~#Kn=fKbxGb_|+uu7fAUdG883@7!@C2gZX(gxA~$OYW=%G zIwF_tk{vRZIEo8grNP#0Ye5$@7g;R`&|oOsoH{MC!3y;N4y}h9wq$6{><8xzgGg9U zBE}3JUW`B=0x#m=+8uU~d0fapEnKW zsQ(Gm>jX!QWN|!zquzdjqjI*8K8Txw#S$OY%Gzy*260jwwsYQTqzn=aG>coj9IGJK zi3@~RVxmRl0P{?4iZf5;O#Vev0T^K==G#hhDrk#O1%KO{sQ6iVEc*f%OPUp*$&O{3 z6>o|DgxFb`6K2I9VZB;Pt8uXUHtI3uoDrFwkLK*xlk!?4?lv&?OzbX=8dT{C`cg_( z=ApB8E>H zWN1LK&w<e#w{wDu2zz&>y&hi)G z^TN63WHg|yDf%>OJV+sdL-EDA+35|Kx^XiK-kq>i`-*Ea9C#kp=Rpg#3^BLiIB0RM z<8buwiNl{CZcpDYclDgrI-%{z21GFqcz$X-ymq(?a2tfRskmOyvEI5Eb~Nyy038Uq zym)IWubWkH*ovWu-vPO!Ei;x4}M`}^oCS-dh zx|v&MpDQ6_hi8PLu?{1!B*8RQ_PCD{T=9C)!nxXqyW9hC6i{h2W69SH)m z=Xo6PlmU>nX-Y#TX28!)0S96i1Qul4FA5m6Btcdd2_RvntRPsKuGNmut?D<%Y4YCLaWsGPrHy{+bk+qIkR zuA2qqeA6qVui!vVpmh+G&yMdms8vTlkA!%=)11&`t0`)6K7^c3 z1N$at5x;|ojdobtse&1H(3dtN2%_{`ieN_hiD)Y|9iLT{8}FO(JV`w7G>^bPwIZh( zsXSjtU25iw(Eif-CP1k(_~3ktoTl7q@8==PMu>;2=(Nuohw(lSGS)aRj0{qg#fhBi z2qM?Ah}tn>E*f#BJW`qo??PKh7wslF+~DKEl}xbf?aF;ZCLbGo`~YGng{yO@eOwE^ zgGQ29n?Zw!c4Io_=}LnWr-D7k3@T;dY!w}Xf+rCu3-pbOIsVL4e9Ye4ooVCn{(bW> ztcAhD8oKlnr_@qo_giwn!)R1i8d)KpADzb-iPPc(#ZYVYrDw@0JCKJPsvMC8&Us2{ z%uwpi&=eBc-iL?k#PdtA*`mHq`t;aaf($S8kxb>>B)@~x5YYQ1$55fjEe@zpa1T*r zAzlQ!>}loCi#f-C^XEh@^(FJ`Tl*VB4d|%4#q(ub+D1DkFbv4gdyZV@5xBRPxB`h( zFW_WAgX|zM|u;+C;U?iJ3rrYzeB>-Gocf z+<37ahvdD@g*ULB#&hMxUrOg1KFYd}jMa{OuM2xv5}ukPf#9>Vr@%Ir9#|!j+^j@v&b585#`x%N&h{ z{T9WzA+qS&K4P#dw5qPixL&o&3Fb)YtDLy?3irSgH@R8BugfRMmGz5K!9gwo2Qk1w zQtj);1p}852YGK0Zx|CP-d?P|r|0lEXXKWP7)OX#8o`M%?j$B$))y(hu1^)zMb zwj~befYcjtLixH_bT&{|&=8%8hZwnr@L1)zLWVBKs@~ieSys@8o@(s3FIM_*z|4U# zYSQvw=pX@bt66@zvhUXv>9nhUyt zN&V>`$itMTOjo;FC9Gwxc6p07o-+PtFvm@pK&x9hbA%3sCrI?O`}W6691+L>et1SP_&+KJ8|w3X#;Q%rvCGspEMi=Q}kg?ob84 zkutTdob0qs+lwcaQJvqDub}-G&7{WCVy!UImf>XY{i6_2uQb~A&xq6fVYs2!e;`u5;oMo}iM450O6|xc;FSNTB3i2|H zCO&=wQ?&PJc;l@6Owb~>uO}_5D^~H>FUkd4*%?gvm!<1hVeFV-Tlr*YLSHtfUqlKy z9Y6rR>}Gp>i2!@}g@X2wU477w0=0*TEr_8Ajf(-gTqvjjC?^25T!`0exk;Dl815!r z1||gq>F}Px2~Rt8^vg7tc7a6u(l*r<({ceI85hVi?O|GNMcy>4y10X{g^qra_Fb?s zvfWpQsf$L?kOwD}J8g$)R3qp*4C*fO$`pCfs?L=!b&aPP7U(YPbMa+_oEl%rB19D; zH{wE7kodua{-TX;%SvMg+D8^5PF!>EjNmV?1BzEJeP0WQEN^?%Rd93${X0CpaQAGBvEp31c=6Ba0@QoXGyNm4AVt68v!o3dV+kQxJ`7m#R zuK@fl%FR(L`lRKN;`=PxqDM1*nPsn#B&&H)fs>qG$3^;KPo7SZzS=iRbvv8&Cxp%!W*(S$N~?7ua6+ z6?EgA5g2fc&3@TDKO7g(e-2)ukg*BuP?ipjQp_mKkx9$tbetebUTezaHMXTBm=|JK zrv{qb2ENFFK)w~LDM(dZlC(hrVgXbErg1yT?~$DAk3m7m)-Jc&o)w$91wFp7LO9-H> zFBnY|(be|$q4UJh4S4t4yBApgl!mtP z`DeG+VjY(CIB%gm#ee3T1r~oV5aea;8xlE)34P*CW*%Nv4TvIc?L5=Ve1y+0T(;&K z+v|@ntF>_Ra@bFL*df@>piB_Y2xw90A4@T_zz$NkpP{gdCG6NhLGix(Z?p@^jOpLb z295ynhl?Q^ObEXdW;*@`WV3|*^7p*DdO^YrQDbn!Ia&GEkaB7)=H1O^hEVvtfLi!G z#`Q~#tnFxe6$U-_&1~#OtXK*4QWidD;DgW(Uo+fRT^{8pjI-&WMbk>)O1#k?G6-fT zwYZ|dn;jMU$xPvt?#r(@lFjRL3;o1pqpFlS)?jZPKgDP)T z-N%fqY#<3X3Y~Bihc~Wb%*ruohCE#eHA(CVm_zyel*q`+MHI%(R6Mi@HK^d-jir z!IsGLxq}{>^$nxHf3vMk=`;%VVn+X!#cHjUm^QBuDX$BimU3YyVpyb0$XvvblJs{Y z^JrJyp4ZqEnMXX?eEW9btuOwjr4VP3OEnR`me6F6d=gQJvdK8|ajoiv@k{0NQovL9Ve1IF-?)0Z%R@Ar|@mk05VQB|_U9UPft8+)|+-K|DwmSFcb?)9~_t#d{y}O_r8R3?2^kL0& zX31IDI5XVG?rj(rDb8*~;^?!$sM5Q5%L8KQ3I2MebeGawB8Gm*zixtGgWg5*_xjym z>l^EDu?EjwFK0y-Bn4+qmop6aZY`$D2UWREzax0A07e)TbDeC5%aw(}b1Nlx@Z3F8 zQSjXTk}G&_qjY`n+){azeoepotbV1^>xT!F-qlpX2Fcm)w&|lH3#`GJtECrET)(?l zPw6lFy1%S97_ec=xdzw{2F_YQMUV#FFKYQJPI)xI_UOf6pcnr1TASTAtlsKVXIDtV z?D@^^UhKl+7yfo8D(~bdy+2T^I;0s&@7+)a_dYDaf6f`|0~`3E58lj{oH5*X_Azcl zMvq`0T?|=(Z%uAR|7m5%u#g-^$}ln1C=kx>7q{8$G#5@yq0hU;(5Fe5Iae-qwTq!l zgo%%3AYSSH{^prV?>*93R6q=$2Unq1XaTzzV%QUm+K?MrQNbBP?=&$CcO{l)chnl) zgBR@82l}SLfY5!i*)nauo`TOjd4z$LzggRBQCn0M`|lRnu9S5d;;T5}zJR*9tP4|M zX+7kOvXh4Ube%mt;(pUZ_8;>rB7u_;`DOMCNHv@{h@mXhBA(|dgi`Z~WUmE%(BS_a zj*48cl9=W01J#Li!U?J?vnVmNjlRrk{S;ZCSmaU<>ij1qPrgv{(?G(-wMKjE%lfF+ z4%O9a3$sH3WX`wpIU7 z)aDCCb)iS&MZHO(v1w=>gm|8E+J%&C;e|8}NE7d~@d-T1$(P~0?(le44*;0sdT6ix z&+W%XRHFSCD)pU2PUy9Ve;#i?xD1+XNbr1fhFoIY_Z#9bCRQdPEm5KvuEmsw5)Jo0 zFtKuMx3vNp7IBaJ>r$u^$;CQ*ADfwQm5Lq5Xa%5Q_&y9yKw8|#!1<6%uVphv+UM4I zd0PKKiM_uzOFU+Qm%jm0c^xAqj)D8BHSzJb4Z$=#Z&G^K$(Jaxv`uMBEJJ*31BJ(O z!?{BOn+t+BEXQ7WDmKEK;WE1>ClaOx($eXtJ2?#m=T^y%KU9@8hu0w@ zN58**Nt0evGJBd_8ag5s*AEY#tCHrF%sRZzUf-zO>-W|lp4GNt>Xm!@8^l-7i?6n6 z?*W5a%O9;r{@TcFkx()fAY?CCDE|#OyzYoTUVOE+z775vKS{k92mtjdv#aFop$0MZ z7t~yp+rcfPJ+y(_nWf5iHTic$ zNevLsJB_xDk)9U}pD6crC4rY)1M!?7w^*Y82S2c|z(f*VgeEMAmf)AN#z}s2dcK-x z?Shy{tlsRsV!UDG@Cjfh5B(gy*(#+~D>;_v6ofP*?+Nt8v}|&Dm^XmK>&gEEmX^Yj zz{FBuH|Vw(b>q`u_#oa0Ez&LcT_fGZ=lA-ba#A)Oogn;v8MDnyF|rlFn!8Pt4~oxs z+8RHFU;Q@yX0ih@Qv2AQhyo^03 zN}2Bc(k5e_Jrow^-{1-u>61wiJIj_P=UIw}~5 zVlsS543T!QSoMrx;A@Ly$3CsC zT7?&>_I|gH4dizH#(2TE@q)oK7Ql-W-2YgSdozfut#uN1zT~HHo&p^vXE;Wk^|@<{EJ0W1}o-Kmm^C5 zD;&+h+1IESo!E*rUHQPRvC`464#(ycG9%Antx46tf+wRA2W?kE+PI2^vyp8>j;m90 zum|~j5%$i|Y6pAWM68Uf5^89ylY0@tS{dK_gpu;xNU0ST$cwY{VmCpuS!~}tz7i9r zgPkr#rsUtNPcKtib5I^?tv`ru5Ln7!?RTyp`m{z<8lk=1WSgD4*BX#Y>^V|qO;SZg zIX|60X)k6N>YT|?=+&1AFhUyz^MXoRzEN@VKyihEJ}E7ZC7m2sO*Vj=6?fp6O!quo z4v?ZeC_s!gZnAGo*GAMO8RULacZho$per$rcTo=Zt5TYb6xyRBU-p+^PY13l;Yyf6 zk~EaL2J(T))t1k&{STL3MG*5kwd2xsWee2nSCa&4P0^>-+YFp{fpyX&NHia*(Ad9P7NyFAagtphK1Ssq!vWev_?2k%e*_jMGNrjWj@Urzh+jcKje% z1_Lj0L$~LNK#98E6F8sjE+WsO&jWuRb`@Dckz{r~SS6dlzaVB#r7tJG@FWjC)479D z)_)10O;Iz&=PT$Q=+@jVVpv9_DcNxX8p!e;{*}n`&-fae$CWgMi!Wh2j4?@h|EpF|=SN-0ra%L~xFhbn3S9~>?4b`2} zA)=yoXa*a^J)y>#2&zeKjM;szMjWLTfA|nm!6EK5KXKz;iVj1S>o|UaYakjowY(W! z3JBzQ)2{j`6OP;)AaPp4mcAo4esU&#bFU<^|UoB+?&uu4(Z%LVPSlN;dfV*l<3NSB`WCC~+4qZ~Z|EtDp}*5}qZs-dJ(r51Q+PsA7I8o0 z5ntU4ee|2GeFr#JxS`(t8O;o3Z4u1xWa3?Kn;&W*ItVo)Q9Pmp5z!~{P5l>JDQ;Vf zK_`ZE{3@{uaU0gT7TD3Td6EatW|@1b6VWQ(Jde~w7#fN?ub;K;qLX+ zDhPc~ijfvXV}*vsSojWFb&s3n3$h%?roK8JkQxur$~wR&<>c2v&s)%W6zvpDB2WV- z#n2zIzI64=!j3LzXX&^RDU#l#N<<@wQW$Vj2-bj#R^>H{p_RypD*Q8w9F(8*9r3jV z@WD>ph0b9@^XOquV90~tLS7!#;@(A>>KXM5Amg6l8cYs}GNT@3rja8}S2L;x!+snN zJtTdHDr*tMw_tj7QX278-rmEpMBT<3Vl#O@cvhY;88WJ(Q%3btB-gKqjiX<-a}T*`|<+xCO$0sT$poi#yYa2HqfyX0h_1cgja2I6(YS%&8M>KmwX0alrKrcfHPHo zQfnuFTpYNdo6v`YVnJ;|AKY^g`5JN^Xb|3Dfl_=t35_sL3Cy57z8J~(5IeO1gM+c! z&w?mVx)kIF9TZYl7&GXuFGhR@P_&l(?ECTAgeQZ0K~zf584#LyZn`$>HJE1{qGm=EyKT7Cymaol70qsR6Gpx*tmy}a4onqTMM z-{RhfuCPRZk8pA==@i3%pgdaa-Hka?R(E3&QB8{Y)`C9WPGtC$?nEF^A=#e7=EM<1 z;~Tco?{CS(`PSxj!?6@TV(IxXUTIEf+qDn1n4Cnap$YNbqYmb=g!^!)U9+XVb2Z_LSw#iu26-epP2UHW}B_-<+|aE z^@EWxrOazC;Uy>GfS)R#lony2q-uw7K1G^mz~sN|WV1EDNWbo;YJ{W|72!IYt~~e2 z!!dm#AF^?}$B@-iZ-TYFluRJs00bE-fn63cO!5u9^J9fK8E#vxBr>*6(??=;M{jw$ z@M4mbj<+1(7&U@*MnhgzdtTK(bch2AF&SG32P@#g)~QQ_!m2^){%I-JhYW%C>5OWA$y(E1;rabWX-x&?J0F z=As=#)-)tXMQ9miF1p#{wCIlE8%MpiyDf(wb6d{f&$Z2Mk?|M6-^=)W32|5f;^r3| z>8BGfFye`(R*PRY=t6wQV|%r@1tD7&IO!*ce)8$3h<-fub0__*iM$m=H{B#-?Do;E zBRpFtW$PB6(qaYY^UmW61$y8V!ECyC;jr@GTVSK@Wt8oC0)4i z%x!Z!^KjHXhMT7XxT~-0?5`20Uk%Z#1sQizFlyXM!JTAZwZv&_&1<{0#!?=?AI?E} znblDya}RawKcOkyNw3&PfeSr9netBPz=?+8>~F`Y&&YfOo{1ORp~tvp$Me`ddgEFA zK>LnCFrrY9ufimtF0{k%=u?0<*4x=)dQqzF;2Gwnf5cu{26AoE+Vr=P^&cR^40f1D zX0O=q5qkE5CtHAyq*+$^>R}Dilv#IK<;lZNOXC}vbJn~hc?<$a%(}}aJF&~8?6nU& zEg#WvWmwbpu?>eilm=^4&t7yh&R5hYDSNHR<};uv#iW1w2LpKqz)wQPbW@9l8KwyWi5m71gm6oZnMf$4_bpb4A_~ksf+0d9FP(5ax!QGn1`@rmFJM0J` zDR498+S)LMS1~Yd zIvU$I!k5q>q+u9ibhnf&+upj68*^^X1oEz7cC$HCI2PfnUK>w%G>)o|65e?u$%8$< z2_fp{HO-HL-OsHs|v{TUU+x`=M?TqYYDYL-_KDNq z3X0*S2smi}OAImcwBJ-C_+KP!c72Fgx{pf?eU3_NCAla9TbGL{E3M=z^J}j8HQoHm zH@|Q(2SHwLeifTvndVoi`ITaREt^A~L%`qs7}?fju$u`d9GRQ_IN5P2s@#Su1F2%I zL8zB-@S&A}6DY;m3hITCln`O)Ba60qHPTM1WN#_Jy=x9XrJh-9T&>$?boyKMnQe8Ar;2hkYaqadfTIapQVz%H%?oI$kY zKZAi%X}s_6py$pP(M|X`#y@Bn;Nu|wpbj+NSLP4|m;;T5okac8C}j=-V%?z3At0y{ zfq~o|G@y1;%nlj^EyV7VALDoPNAk=3F?kn%OnV8BXSOAG;GyAG z;$!@2-`S2QG;}*p(|5Q7HEc=F!8;kj?4Zb<$55Y^XJnG!bplL`#np8~DA)*Qb-AeJ09G!P^T@HNAiKgLug``w?>XQUV9 z*G|xtHf_X4e)~Sy2u?u6`f(C*17MUK3tNU~Tm=jT9qIjHz}B)!a3$|To@*~-iva-l z0n-QIOovaSP7>*5>icO^5LXIBs0uip%da)i(#2O7U29i9u}W`&pP<5Y0gidwfRzja z1V%F%U0|V$?D(4lRe&Gt1TP`2G~H-18@1;CtrrtkxII?lPR?hMkkpQet2`e$!Rv&U z!)Hbjd?)a$)=1l}NE2{X#iho2fsNjVMS8WPhtn^P1j3O9b_td@LDfq4^+BQC8vMjo za3XjvNxq@_SGdr(5V~O;Zp#CM*?d(cTt;mK$-o2kQf@v8M@X`WWTA!!MO-EbjkKQ1 z^~CQOE0B;DsA|e`GV0;A!Ayclpa6~Y5#xUpS5ccy`A0U0(JrFQh5aog)E+bIG{h?=)_L zaGzu=(FR<=$ub~j@f&ipe}tB$QOoE?5W-Rhm8A2#9Yo44ez(KRanea-ouHJFlq1pB zA_Ato4-#b4ZYNk@(+)xlyr|Sv05arod7)7`-8Z~3L zZKY;$a^h`sb*{aI0krK-c zj8Yn$9`-%J(cVIBsR>Kb0=90zf(V>L^Ty(o;DkB6oYA#+I*cubk=KYe@l4#!R4FqR zo!K-`D4wHZtU_R99Gq8c?8T6#(7IzQI0&|yXsZhQJ2n_Z=~mhi~lJaNX>4AXza~PlU^IpfaY^EM4-JN(&U0EnTCq zVbbLavy0(}5QQsR#PItBT;_1b9m_`#<2!AMBf1~YZa3|Eylg@gMR6Prwd_PnOBB*E zMJI{jC-4Se2iRQ0jv8&%!RV-?FCFrDUlfa1Dn*u1LQcE{eXYW7BL(tsskl_ir}~Xj zSc(|_48YJPIV=rwaazEkFD$I;l4sSf>NDN~w{?@!!lKWhz{zO=7|xpkx$z_;YRfn& z=$G&SCrn)T>rf&)NF&d2Cx+j};3}-@lr|(f2;;?XA-nQDJAnnVPnK8W5@x@EFfW@1 zbkg9WYsr!+CyU*pyZlZb=^PX(@W>>KKEXeZN1ojgPdQ3y=5@eSo+xwX1nE-tnk4v{Ll~jit zHqMKbe5=Hq8%E+@DG$2>t^}};AclUNNW=N&U09I#dK$!%O(lWsNppJxodk5Q^c^@+HRf6qZ$o68N_|E=AAQ z>?s$@e*6wEE~TRy7x`uy%lOnhY zfQc*I;+RL&Ga>h9FS*rIUhbdz>w&Wzd=*x(kEG<4>SSa>rwsD7rTo-E!5D3gL+S6A zT*za(a=u@(yS`q3b!7Vb$g)2=wRH57@-QwjJ?Q7>ZsrSYGl=JPqGt^s+wr0ATDc8d zF4WOD5OD|RL_PEDB=GGfIH`b`5?x8#%BI)Si35K&9W7nsG}dIYxnR4X-YO1*W~fQK z!AWR&3mt}bh4H{Rw{KTg#zG$YeCp@d9vhTjlPpkCs~A zq91tj?EHsoz;W;sFpm=q{roGKLEZ-7KN0rO)wP9Xw@ci}t0I#!Pe|7D~ z>~t%+cxp_XmjOoXTIp#!x~>O3_cOW4+J%t&f}~F zN9KTR8pOxMm`a9xm#7XD6k@0Z)UJ7#?a0I}ocx~S0~LjZFvM%W_k=@fbl5(0y|ead?|z52d6}}ZP(TEa{=dY%3w%`7wfH~D z%p^ldm;n-v8ZgzMXh2bz+5Jg{Kki2p_f&em0M*1B(sl?ZtJ_mB*5pRYj48XU29c* zd3KBUBK{owt;lZC<{As>ceKK*yWn~#4gRmw*V_fXr{pJmM`Z01eZO%B1BFvr8-{DK zkAniG(>s&>fj4_T-iYq_jU2qt38G8!YF<=i19N80T1D&mI&|n0Uvt=cKmRazTmJ%8a6Wi&mE$SKAJ<% z=QiyE{T4>gn}KhCO^6+_bsj?b**kQCBVb2C%k}gnj zrz3`U@)%Z1m2BP$9Qgd2t+MLyO^#UCZ%URo2(~Sfwwn_>(*sYN9M!s{Pjkqi`ZO{_ z(iz7?6o>!G6B>rl4;L9n&SA9^v;bu5YPNe_N zUiwtE8X`<%7n^jvg07&*(1EdVQ}67nZ#_7^A+mvsS93Y(%o?qj7}cHmJvf zV3EW3H4DxTy_l-OXhn-R)!*V+c&oAQ!zhbhwqKL_6XL!0{zQlOQzlWWZb1;qXPox~ z5*Sxl?L~F41>B_n~&Jq1n2hESRdmOD8Ao}dxvrLXAf7gg|BE8TXjoa zj%t`3|2nR&U#-titvi`%|M7WVSKZ04$P+8y7xBcX?Yaz$HrDWyo5N6`QFOjo=cSb# zm6<=Hm3-`Ok?tXmyF7Y(^dfy$23>oBazjsdQl%nxLPmX!94O4`_5*SOCC4K!*<=9> z?MIZVHcoNsylQQeR$A}UxuCqjpgo;=372j7pfcwtl+YL;Y#$rJh+KO(n*Mcn3z zSZa!4&>&aL&tOBXr#Bo3uC&!mheWsZ+PGi?s%*^kgd)bDRg93|`vuw686@dO4j~N( zY7b&d&l8Em`5?L6iR*v6?Di%PMy;xBTmROA-`Vm`^o-qDaFtD*~7V@G#rO z3>I#iQ!!Npv4wWPR8zwZ1CvJ#gJzI^FdhMf|4Hd*xap}NS65^6@gal%78(55KUn4x zBEal-7bLGv7o!5LdXde&rzYP$-%;y^o2B2>=~&3+Qh1DP84xLh^j`%K)c5U zSc`$~p5ouF=Sa{Rff)UV*&^_M0`tJT%gB*tFd`5HuKffWRZWkouTHb3b=RrkJlkKx zaGt3bq~@v7JSI;K=EOWTma|0OuT50+Je?Lcni-EActn@nRbot`0mN=9E*_moZs$7IKgN7G5|Mxc6wuC!`8KXZ=hGqH>&N*V%&JtCHcEiKS$i ziL(%cN7kkrWj{3!SkC%S$%E0-c|!q*qzQ0(iU}Y^{fdlFX*GI2A@r(5VLa30h^$Pn zztB71a1CYqPZLfAUVxn3ob_;iERnU*#3jZbQOIX#`)gBe&V~mCPy*FmkHSxB`0?D* zbS=kdjpp@!9fY>TJ{AE)QkkV1@B%=Fv*ijCU^v&%V@WR~Urp>IL+ZIwz9`4ppJ=PH zlrg^Y?-s=A>|!I~ezdHyGHb^C zXhh7B`-bo`PQ0S%l8IP8hzYg9kfhfovjTp!TOr6$m`V{QF!k~Yhkq>S-e~$N9RLCU&dIb>BHm(h$*goT7K#G4qwYEml8mZ% z=(AEI;V?wvd*nRE#d8}u(v$3A5 z-{OLZT3ht_$K@7@4@G9}@?cqCzcpXGh{75EKtUohY%LbA9dr%lfPg_oY#Vlvr>-1`Olh2+n$c1cjeG+sjRIAaS}L6N z0SYv(5#U?Zf^ZqH3?q0$o7MM31`gh{wI!IXyRc>gV@St1SY-xVS)=Ma**kSpoPuL zkN8_{xt=4nJ&{7g?>WxoGc2{+!zh1eVZ{g>)Pjuz``E}6-msAm-J+^$==Cw~LQ83D zD&niouy~W`SL0d~wM0!Z!m#+Y;G8J#UM^H4$NAvn5>lHX{*^gHvVX24Ih|t?Q{&!V zI``Z1vx1-K3S7>szd8#xVRRKP(dCTsDkGTBgiZ-s+! zwf{bsb=8#I^3*k#>I*Y4$A?ZCx7)NVAw|$k6PSx;S{T{q-1bwF>pPze+_*ruYKQ$|f_!eQc-yy7aEn&5_D}!5nz>F#DZPF>zRFG3u z$`I#1O65tc8n%kB8INQ7p6osTLr!^|uE?kF#Yoc)Sf|oo_aCYa6dLZM-tpN-OK?Vi zDV@#aA~$Nr(DJny|6*;m?$5?q%@He(Ymlet+7aA=li=9XBn%hh;(W%5ZX`4Kdycil zVd4rMRszVaHcQ#ihFcdJHw~2#K0lTiox+w-{IO?r@U<$S!o!g&9v79wszsGKKW6Q} zVyk%)9#q=MBmHDl06-I+k-5=0Z5#wMhiZC{yqoY_ve~!k4w>+bmeQYs$`IC~`@-Ip9H|M|zCuv=aBt=fOzaqE#b@cmbcJ6@*P}!d8IS{6x&CSkb ztHnXWf%Q01pWa^(zEzMgRw@)&y$gfMe^dy>`IR6%Gq_RVaLEW9giYkTBg;1uiLrG% z6aqU|y;YE#C&;h=ML0oMZ?d^YgnSRXBwZFiZ;4!2TG(Xe)O+Kz4sG;8(@h%1&*V(V zArsM>lBZiy>H(BwM3~%UZ7i@U9)GYPxybkt^ugRGij*nBcEr;=$L~38%dPHR|KsTg z^kaAR=U8Vb02nvoA{rV1Eb}+peBo7X1-80|1Dd_6zl@z&>wJ+l`gsLqX~?Nm&Y@Yv|aF?x=G?Pla7*pYL4nT(&0|0w%OPQfTByvOzvx%&j; ziN|9sEK@C^_9dAC!Vn7=`}4$xk5$X5vKh7i2|CR7V&h}=#u=yGJ6c~o=>K?>9KNj_ ztz(DSNmP!u(_Fp{TWO|C z5Z{B0-iIxD|D7h&BQVeA9T%C-&aiYE4T$9soBvxVu+DQpr4Xe+=0)47MHut#76odQ zj52H@!csCz5k8EHnS9{zG1$&3874s6y^HnD<6QZ>YwP zi(Xq5eUo?Z0X)}t&35{C}}O`avs!f!Dbez zq-Vuc&TZ=5G?jBR?@;j}Q#sd3+?l3wn(}Q~56*m0OB7v=Os>M!q{{*bmj?VD-V|i zy8lJ_jDQNBL&Gl=U_*)Gh5Hz4Uy3HLy3{BoMIhbC^RZMI(eS|{ZoO(*e7QE91qpe4`zh+72_ES0b^a2 zbq+BKZ{r>)whY>9^c{N*u3Q$nR&lM0{in;A{W-TgTVcc<$FE|s%773s5=Z!!4};am^)@NMmE?A2NsQ)qC2gxvvZ#B^)@ZQ%SDp+Zk*G2zlC28 zXMUv6m9z9zRL!Gp?ihQL_h#MMbkmqgl5mbBye^i|SA7ZzWgk6nA?2hb&Onm#5=nWU zq)d&aBo*XTQeBc%94s{OX6q`_6Orvl(*6ML5T4O`Qn1HEr)9%;h4vP@oZqXIu*5iQ zOV3TP^$REBL)IP2;QW}fe?m($hE6mN2)b_$C!UK(9bZn8mNZLZ+N?=ojdl;;6Y*fW zIp{HpVCZ-vr{j&e6GiY?c|39$^j@zg_Jizv-1JmOlDsdrSyS}HrosreRqf$PZq!#2 zRK$~2aaEBjp_s<{N|~zMjwij1^mD)mKQqn;=P~fYX?mhr`+TWmeAwO;2kv@nw&%EX zfYh)-YA9{Eo9B&9qw71?CCmwl)Q}yDb4y3qiJRQo@f5yl%#F@1qw{?)`Z&j1yhhV_ z=axOr?E(43c1wzJ3N7Y#%jIMZ-#^Q}TeDfaxI!2kFj;fhLp3h6uOHPkUUxPw8Z(Ii zs}}pZWKMQhc-)DuM={LE(a2%^`?plh*al`VJ-!zmJuR70c^oBz5c}Ln+E&%~R6)DO zY{nvE69|<13y-h}92d7M2;$DEkfqymgk7MsVFLqz_6gOSPyJkc3$^0m&dSlfFL2X2 z)52|xiZP6e3jaSJ7IM&nwdZ`nfzNP8hKK=qOYu4@0;A{5$%k9$3jL8lgz5g4QwT%9 z5}Y5ephCcG#8$LhlPqck$w=~()bDY{N5@LMaI{Vv<0Hn(ZECD6ij9>^aZWRk&!EZ64%}~&Us)jcg85iIC4_EivlTu7{b&qTus&=A+ zbGFs}c510s_j?4YtX`~Jspk4FLc%*m`Sb$g_rOvPaLnrb6xlUooqItZ{7K=WUQ1pz z78V19-C_Kg;{`~BTbLpEMspbZZdU=4atkR}k1m)QEEB8Bw|!N+Mlr@qCS1&W&arv8|y?&78T=3-d~Q`!6?w|Yqy zY%R0c5LP&_FeErWSb+Hn(K${i3lyX)`y~4Hff@(4+?SbxY_VmI7H1;E|(dsv2{ltW<@nst#$<(Qf0Mn z$l@36>D)g~<|W{HJfJG&suTqZ8;zr1S6FH1%i{Jt z2fZH?z))m!=&b(@P{PwN*pl65ZIB``N9ug&Q9`RAZ<6}X5vl74FNk=a7Tt_0doY+x zhJ}DFd|qsa)k_q(Mbb8dwW;oNi$G#&-CR@>Y>?z;wM{#yvY<^OfzHi)&y(&p=Y~wa z{MC(AADzf(M&QSCwyBqt$Tiks0EgKnaFaOBx#0ueBA!Pgo+raAxXWOh8LwU7d|}M= zeb9UwWJf`P-}7{QpzwLQ7r3}Fnj}~5-Y#6v%HZ}q55x6g1?5S>!aD&+nnm1aH?A6v z_nPq(q^kzY^*rr-@IEMI=$pi_)of*S(Cw4t%k%hj{5U>m!8nJrK{&gyVZPb<(4CT? zaI^GbcH!ee&mY`sAg;btU%WZu+1xa4mhUsRDiqXaNy(>a8(s2SSN*hwA-HO<-bbG7 zK55;DXDM#4{|Af&m-{_?Uocvem?Frt2b5zT=G_TN=D}@lmh=76fZpu#f#2B z(fQz72!Cia!7=2Xc0MHbfb_zrWmbS5!?Zz^A(us4Z;HP7X%LLlp0>WOa7>b2?pB_);5(GS6(usaq8g90kMMHzA^(p!p3qT3iXpava zZ0|)B{flUiN2bNbwimAH!*U~>#3MlIo+sIhmeAUAE8%&}4cnLTWNUYEQ*3PuXUnM0 z<(tb2CMC)jaF6?P&Q~kO`9^<05@*oy#wlI{(^$L1)@;us%Wv0%LYl>h?k`KA+Pl*E zQd@wnvIRK#?<2MVtz`AH1$b6Li!u++c7Fevl#yfjhSHg9<~N>IRP|puzt3Xz`v>Ru z$40L36NZW~CaFTtw!+^>CDaP93)EpHP<2ps_z(B>WMmz4*4VPtRg#X@3gV4|oPn~6Z_@01m65^KdJ~^$= zOxIoEOzo)K;aZbHjH}oG{`Evo?Ibd2e-idq%lmfgjtXZvFqX6eH^pJX_yBn89As`L z+d(4VCy`O%Ttec>Gd7#R2MIrDhL@9W$veckc)m*JvUIT8&&Ov#eUn6eJSA}_f6W!n zvZ>7`kWAiZJjuHNqA;*1E2HG{H~650GEgb|I}j@!KnwE+I%V@+r1+EujR3(;MaL}9_l>V+0xXK<$Rl!v+j@$BCEe+?LqK%ba=i$!7Njtxci_yZI?e6I5YBgTqE!^MJ)zj7e zajSY5tp{HI2DLfxEBWnj_%^@!UWZxL#8&eechLSY&C%N3akj*xqKU(a(bVs@oE2#1 zzn)!CJ22HpnZB1*o7cu*Cv~(Yb$H{ud!tjZySaPt;Gyo0?%wXcZsXmS?k{?}Tjhd& z-TM|uvwu%*MPN}@LigQS39Y}hATRMIY(=_aX+3B!Vz4M(`c{3mZ4&-`YV+jBYwd}b z5dV>+6!r(TsQ4%Fi4p9lcaLs4G@5T)AUW&6lq~GkU>`XPV3Wo{*`Y&}2xm#j@=O`7GX@Q#a1ESVnh>Cpq{@{>d!w&?IPx z(4fgDp_M$#_wqhzn#x}eF`hg%U%d+*tr-yOve&m9vb78(=+MO_kpIa)EHV@K@(wUX zD~~`sA+SQ_)Ak{0ozbiiJa9_hJJtJ}ystiS1sQgckc=g7lUOpf)a|ID!RtO-&j4O~ z9-wxZv=J1>Gge~c&VOXwW8LesTorPGrJ`<+1)GtnSqv<_bMHVl=zV9#W>wUCpW0>H zRpGq1i!zU0Ls`e_c0_|%CsrRPXuK_}hjHs15Br}I90xnzZQ(0RLf`FR)r0QZvY1~k z|ITp`<=xi0Lwz)E-AVafeX0MX#d}%!Hl*0J?yB^1f3jwkOP4Wp^X!J>ahz82s8Mbh7d4u&q`pllS7Z*;Ra z_3FRDj`PO%{~6$i!v7XZCo=SFeoTtG8H#Ea7~k6cH_{xAt}Tz51|#@i!tu-M!(z z^mK))$;(5KD?1Z~IL#>qOSaQM*+TPFu2`g54XYscn^;(@(6IwkUnlRo-DlS9C$dxw zm)7(XY2ogUu0um%-G{pS1jJxhw~#^Y{O;z1DenVJ!T?B^H^p2r3>>?p(sXY~ro&^6+?=mEu_Rw^yF-+5-XLUQLq2O8kSoh1a zCwa`DcgI`8iA^5yxC-*D7dlo+!?)g&gSmq0i@k5#8e9s7s zFO1tv7$$^~nPD*rhv^RtA{HD|n@9N|;VX)kiAQ`}!*^v|8W}(rd8puIf@AbS-XLk~4U^f;C{f^8PdV^G1ty<}^Rm<6~63Chu z3i8waE7dG4pABCHZpEa&+6spH1r>R$)pNoxjSQEdY2jy02(pUx*taqfM=o;D@-02N z`kI3&yLk^!F;h!rdhDCeNd06q^_ql(Db2hiAb&!3gmVHj-jXv--hjp6OZI6jT)osx4=6kqMw_&KTjh7<=wkYu@r@J)Wk}Sn>~d zX|z`+g4l?Di1y_*f2RW;go{82$eOtGcyWd98B?KmsRp7Uw22jUuX6GTEIoy&32DFc z>8{ZM&u4+9{Ri&p4_kXYj%eN^|C95JYmB0&EKuXp($)L$`DL2=HqS4aX1eJ4#d7-j z#X@Az-burL>HLyo!uaRsm);bG#Q(SROP>iOQ_e4)ytDNFzdye$kj0_JuvO%Jk*uA= z!elR^!fM$YTF7bI3HfI8b#YwcuYAJ%FQp1O;1q9^F>oXk325%pR8)Q!FchOQPhof) z*^dr!K6mjgI*44Rb8$a5%YBUW=be%Mb41cnPN`_s)iE$5*SC9)%;rN`bnRV(IYG34 zBeiIo*{(+tj$T|4yMap0u_&?_-A0%DSiqC&UF>dMKRZ%*cwG`|`HktKM?aR7Ma9M? zzn~OE&bVZecwYNY#h8D5OwYwUV%k|5rE9h~Ff-)9M-nw7d(T7WmjWHnskP*|x5hjO@ z6_Bq|xMCr!6d0n;KOi{0gH&NUw-gVf7=-uSV^UfxUGmVn7+R(fxN-=s&~Fq(j6U1E zqfjRv;~&V^-r&V9FHUswgY!;_5uw^O_V5dQ`u}@g%?H z<*?w7?Vv6LCbJUkV`A-JGMdytg8CYzE1;gEzUz~^^BWW%HCIz;jv zxEc99;sE3V2m#KleGb)BwO=Jjm;(Mx(fNGh_fr4d2^k0+Fxdxs%4`BMOcBghzR7@( zq&+PRVmw|u>+fTcirPimO%!&K5cbu7lh7jL@b73cTh>+y-z4xNZxtDDn1N5Lz|3gi zHUc+g@e!1ZHcu8rFLb4tO&#|Wa|Bc$kH?92qghOm(Lg3-?VF~M&zoAgG8Qh5>&iDx zCiE%!!F3>a#qP^ZQR%*0Wb7n9GDE)fKH~)eatzPj1Ktv*->rhb_q<@?k%d*soP*$w z7e(G?qma<=F%UM0F0*m1iJv!$-ZvhOqSt3zHL9)<0ZpbQJXgJ-7Uh0QDv2Vy_o^ae zfr+yBl1L|p;XQ-i2~SC_B^J-!+0j^*{6Q?faTRBVw3;zK8jc`}f3i1F2~1l&=AyAs z%zBHy1!@NeH6_+kZHFM_6%#$ZE%Y)Sh(1K=+KI;2)6+aQl!hBi$fTiK6@iHi{rp@{ z^4d{`s3TWh6n=w)qQCi+f8e6EFO!6^p}+1OcVeldqCH`%C3tf@ql})n=qHgePTzL| zTZf;G3V0lA?EW34VXJ=!l8V8Kz}Q){@`W;DO?GgN9U1bfPWiD@WccBVz)vC1b5Wo3FhC^A+PrY&g2#D#dc*lB`tsyHsRw)oESz z9+b@Nsse6{rqjpNTpFEii?&^I2r-j^wa+9um_2fg=$^G1sAKC;v!KV;Wko?j90$qoNw7K&Ub>!RUi_@j|qk^H2nZ%F-iiLBiRL!$c+3~ zZx~K^d4ftfoGiyoR@n^9A#h?u18~Es#zj-vASGDuEh=t&LM|>0xt+XJxt%1Y(yo@7 zWhOqu0QMsK1slnWIefzqc+IFN&n#bay#yL>5fUui=nq|GZK<+GX5;~av@akm}uom>*|_}V?9bAum`;35gS((B6gY*;-y;@NORQxZwE zaJFZIf8b(7&uhNvuih|r^=(yGl@V4{I#ii$a3t9x4p(?XFxsW6abk5YJrm74&1AZ# z-r61#`8DONUcUF94PPpu?937_KWhnpXY`)d5LPo;cJ&5pwXZa^iJDer4kI3SCfNNO z&W8BU&jkCtnGD3M60Pk;Lk;m;_Kl}Cg#WDYZax#azlye`d0hD6k`JMu%!4a`DqJn-)zqE;BBgN_nL%GMsLeQdIVw zRp%IA{S#dWY5rawwH~l(*4M&I`~!CF*6?EEzTb+e`uv;F5IT4If#ND#u~9*gznSKo zc1&8yWp;LHNu>*VWXzAn_S_1u;%l+5KW~<_>BhEa=&7JA7pCR$dvio|EF85Cb2Vgl z`D%%*!|PdxKW8=c-WAPj_7mq8YNQ5i;ie?%e9(+l|&i7@?7A$dcEq*F*|&iP*3>{~R>B;Jpk z#xy2T;H$$0rW@^5!v+4qEKr@%r^HrD&!E~#$sU@`Vlp1lu<0*OF|bFLjIONGXcDyp zYB0fA2RK#j=t_K>iC5?f64X_@SW0WxzQc}`BZRS$w45XBe@q;gaB`QWYNY^Nb6G{* z^;{?X-Um#FCa1o*i+k*tO{mbFY*DysH6hvghY7U=M^UE?=4>yM6CKKFX1DmO z!mr?D{F3>w_UT}94(f$#v!?HJx7MUJ-IR9xYp>!LpfNee>zX~!z4+kzu;24$yt~@9 z>Z#KjvpxJET#nqbRACvc{X5eww27lbu&{3--K(m(a;R0D^~?#Wo3r6cUgn3^k(5y+ zhcAu&kQzBIPDS2)_vdT!aef=$h{G)h?HM0PM*`<=UlXslM{g{0d4ug5(-fAAc7>VP z$gE@*TEcP^Z8pa9fqr7_AlLs;Z0uhvurC1`HVV=sUZ;DYaU!R*58ym;N_$;z=Nwi< z^EED+CRQcr`S<{4GHGS=v?zzA;j7viJH!uF-o;IhE6YfKp!sfMr|lDJ!||MP&Cmg0Iz`j$_Ub z$vZA(H|10Idj!6H2}QP(Y|$ja?#!Yy8Y~%#Q8`7uNYQ22G`KPaosvmX4@5?NLrLg2L$JI-#FvIPByae18zHq}wpVx6a2QyMZSE7+;(MIi5*HccQeLV&nL)GE;2 za0&CUg+J6Q%F(-6(#i8Lgtzf7dM77jh^ZRZ`B zOFl)dBmz6$Vu9VvWp)3#>^$q&VHAA{}3+iD|mhSZ#!LnbSgPJ<^nEnGx4PT2u5@_&t0Ou!@DTn^z!7r3?Xqj1HYVU zvGRlz2Z)tnc{#@42a*d0GY|T=Y$tyt94RA>_4c?48x=A&yQw!=E<)vJ_1;Wm+8r_z z`f8p2cbEjDTl@p)SZ2s(oTdxPIS5xXJ7nUJL5Ys{zbKbqnJM(+>b5Y$B}CbFydB9|8E z<0kYe?1!N%NH4}A!?y0OJ0$iw{hzs3En^ao7N`?es`Mu92wgJBj>b6--DG}O$Zrj# zWA)parbs^~*rgF3{25p|zxS?8J?j6xKl2iLh%iMW=;`LIeRI@!McwNR5=DRP1fa;% z-xSEbK=9s5Q%4EcB73w}BM8`;1mvI4uG;Htme3Mz0qLDIEZYFUYfmA|cA)`-^jk{1 zs^w71#Vy;UKSv|~zn2-dx({5&r3mfeiRAlJ=dwN9E+9wfQR<~KNS`-6O%TdLB#Jg( zX$QEY0Jeq>c)O$SkaSz!Nwf2W;Rm&N4IKcBkG49=pb;6~a0hF50!a}X3jL>@D?{gu zj#Wd%dvOc`q-v5XW&kt(J$4xji0BP@oF$2~ejdGMRwYL1V%bfjxx_J34l@&WZu^)~ z7y1DifJE!iZ#3NMeKcClKC_)i?@*nuCWeo7nS?1_W^>wI3lv@I*p@-%L$YZnR*f*J zHSZ(a5^X!xmMz1r(zK`zxBY+c>jx&H_+dOt*KxbB@0HPe86Qq%orjXV%-UT$tx=MGJsPj)s`ff9Y_*lJ9(%7eGtIS+=Gvi} zEBs9v-NU%5(Wvhp&1ggYg5=xI2W=_lYm#u=1ipsn*xE^}?2H$5FGQ8^3|eKErCT-T zKhh0JM@7Wu|HvWgA*_PZvGO$Z@tZ3G9#U2t-_mNK!df!+2 ziY!;*OY$u7gAwQVkJ4YUbkP)bJA7;dN?#%UmsSb=)4Gpk^?)S*&sPgtQkLP7>%$)K z1MG=+T0Tp}50AdX-MRZZZDPL?bP+tO)ab30M*VpeTCk8e8BSs%~Wm&OLr6cmB@Paw6i@g0V=Rkp!r z8)XirE!CBUxtY4ll3dcF@`dUJg5W0lOldNr2N=;Lv|Gp&x|3)Lln==rTBHJ29-7Oj z_;7euopnR>;3xf&2xAoesLZ+!b12;_d(FP7XG2rbkzH?E&7D@=M>2LPp~X6V#}GYh zn95QRx{;r#Gp?9VE;&6cMD)*3MwYr~`0PduTF)N}Dyy_u4lZ?+m%rEBzjN;WS4zae zls?xy%R+Sb(9M&4(^aB@SR#8>d|3xJ^YZ0K=_7Q1Tyk(R5}E1!@AU$qf9EVTmU_3! z3Y6d#ow7lHKF0HoP=-Mkq+3z3Q^G;7U+C=sz_upU%9ilxXrl*_C9A!|#>QeWe zd%8oriOWTjF{5B0y6AR9zocyMZ79qd;YGQHlDJ$FFY58Q%r^W_#%1@%iHcSmdD zKN%ORh;{)=Pv^#fVds=9L=K5;1`lBOq=)$g`mvraj1eHKo>H0qFmmA?NGwDyygRTI zw!mS<8Q=nIZ&jk9aZVFCuJP3*kvaD&E1ZXsGb5sname!!A1j{pK@4=B9(7SH3V)XO zpB|NHMj0>D!QxbV!a?ML{x>3lyd|)70(nLJR%SBDjq^!?5l}q5ax`3z4fAzR^^z6@ zzJfWn#Xkl^W%z9Y#55Me&CMlKh$u03Q4V~g`t6czlbO+3FCN}YN{nZTEYHVvlY|?6 zf0K$Jhj!N6h&OpZ%h#&fg~T9A40=kDaVndffeDhYavDF8v?qnVfaR1OBos4|DN>=Q zB<`-}nTYEvawn|egX^Jb^%A&mrWHf=61+!(&wr|m2bCI&@z!j+N+S8X!U<-F1U;Qa z#Z}jHrjJZ3t-OZBa5!GWSPJDTIj%EzX{RQd54xqX?E0|iIPiuM#i4vFZB>!V#%NBJ z$0d12OUitkWWuwZdQHbt7EOS~tHZ_&2R)RdS06MkjJ|al7pS+Gt95VIYNhTUMPAuz@G7($*GpAMmUE$Vt|HgM#WP^}3r^ zcVEq1|Hp~p>ql1nG(Z=83D7A0nm?)fn^$1T8b%UpKO+e z;9GH5ucia^(o~qhbKGe{+O%YMnh-kE(o*gWAr{VhmMu#~?u^~?@q+y=^+@UDQN-t) z(dRySYH5VL##@O*y)Hqw7UMxZ`d(6UD;DSNLRpH9rR)&+c#se03n}Y)_;+Sej8}3I z;fp?N*^VeiO~Ubnn$txQ%a@5#fBIB|KU_qY>LxlYhh5Uf*VB}#*W z_d!+y)m)x%=v{jIqsvcVDx&ho>^-t!;|~ncmEc_KC)ipG&f2EGgU?>$@j_CxU$DQ* z@{(_1oTZqc06|z!vkr`1d|aqWZQ*)bLu57A4F~Gl1q=V;}IxrSI3LBH+FECKRDfqz5hAgr;fsZ9?TR*T~YIJKI*BqIb>8&1hQxnX2r9 zz|F2~TN4(J@rdQY&IFwGX-1L&PQ+Y8`J*RJBFL(g<&9EH110H(S}G~k@n~h=(TJ3K zJEaz@Vyk9KDq|1b&7F5fdGGGee8gz z+|2|CV9wjL2_DPy(=+m{J1x)3v*!868F}WOmZx$k&sHh2b*lhr-73MYTLBDgu#HEjJ*3z-_l`i?wzBbe7Oc_BjDl!5vhEnn{O6GMDKoU1z3LcIU?f^B^ zE&wNmkHU6tRx-Hkn7;3p`)&>wD}+;}1%RJ?2Ew~RIQ@tGq(-rIf$bQuO3ruG-m z8a$JEx^B5IhWPT^!FyqeQMrK`hc^q&X>7h(v^tX+L(t62{55l7?^IZ_3?M#m7wL7&;l=^P)7LI?P^~_UsMwEzTxk zRyzHQ`K@qXnf3@_tM8S!Cnfelu|GgQWE|!EO@@PO-f=1-miI6m=c)N4-lvUt&*YsW zZ-{(770$K;aU98oVgCt7|1T<>Z-JKFOoB;uW!gs4I{h1|{n<)$jeu$y@!qFuVq(!d z;=Oakd-I6*%_H8Qz>OR@LKu$@!gTJ(uW)#ev)O~#0b~T#$ zvvzIdKFeTOHE}=3G z{?yH`7Z4Qrce)fV8)fwCF^2$`D~AACdVbV`dYWlNd5p55>`lzGsDlbf4b5 z!)B?>7|#hzIl#mvfN0j`=B0btUf7LPrk_5;!3R^)zWssZc^JW%nYq?c-|W2tLy=iC zFVaR$@4&b&o`X(0w=`n~`!;hQ8COsc-cM3F)L`%U@5=YBXx&c`*d?Vv-!fXDr=v!P zGT$*RT}<3O#)zMp=Z%|JV!Vn_x}0r&oOo~3KB}@|>hR^?KpzllV^%%yFqdf9KPUi; z!}%q~&&Z$~9^Z9&<=!i+;uae}AT?^pm}2qXP_h^W=XYgs8KKWM8}@*o^IW^l`uCiP z+Mgl{m~kkB9nb_pEO24FJsEtN^^l?RrR<#X<{~8uPO6rLGLKK8=$xRcT zTUv_>jK7tcZ8<)Y$iWPA$Ed_MB}6>Qjd2C_2Y^q3-m7t%ZP9+|`#ck?E1!?j{tZaB zw%HM7so!@UyYdh?NVj3PW0aOq5I%Nu_yZNuNrY(Xf*@7{1wmINjx9d!-{K2q`L0{y zJt^2;BKBJ@lw!Qe!2-;DU4-kPzHo~8xS|?Vf;#LCp%*c3fhs(H$!sdrp&gaF(EHxS z3P%Sh+&FWTcV5E*Z(hSbxz*#n*l<*UimqaeEPu4V^3RYqiePsat0`F zoN(mp!UB01>x)mxXh#El#&H>5i8VE`kzdkxE!H+88m*Y5e>=IhHJ8i@+a-K_8ZD z39aEW_bxoVwQ9ad+7zlJwQ$zMf{4HtOUlnl*FKk@{_M7V-C+Jwj+*Tn_V&{r2SjKt zX=xGT=M&Uajs}Yr%%!*E`N2GvD8(V=P6QtV#ig&@{9*n}?)I11yhgk!4Xxf$CptHY zL*Vco9DoO~!Fi3~q76>R6na`C#Z2!r9eK-hgZdWD7p#X!Ej-7kd-|q}Q=i1`w*Waj zy5X3HXVI2k*XX{$j3od*@fIg}p39b_)e%+M05wr{$8l0esWc0LGrTD z8oh7v^hj`726t;-b3w#vY+`MyCV6^uu*UV=bI&O!>Wtd#wx;Ct#?f;MwG+Yb3o~)M zjH0I0xW=)wZq`mnYbx7PD-f5~9m#+b5mUx$c!UD6d*!LeB?J05^)yLC^DC0wS^o(` zYI<`c8jYZz?`~gpyvfs4-`v(9-Gbq?!A7m6@zl7rYBT4PhXu%trYsLEnAmQ%(7(K^VTN&ZW;sdy}lip z*c1HhytR}z2GDzbA7wVW!qzs6WtRJmRlD?{wC?ih|8=_oDMrcfaXzsRlU%t@PV3!E zP!IeQSIqQ*r?POV-Y{>acY?q6Zj1L^eQhO6v;(Wwi^ehYFkXC=#I02+#;S#}v;Epi zj32vaOzy-t_*XH9bw0DFQ+1!_tUG1;crP&yr;+|CNfek@sjJjvBk4hs#+U*O2ut|; za1<#Zw}=eUnFpQ4MrEII?HoGu)TzLP;}9TiV!K_Qvu?laUMnz560Qf%kH&4s!1Itx^t&136$cU~WWnDxpE;{RP z3YBguQ$g9P;CHAt-dEl(Sj3DK#GB_s#)z^X)3fwoFft|b92s~g5tWI`5 zG(Zu)>W={_*TRF^CrxAOJ50{Ib4x)4tCOK$5HSKwB$=8N9tO-^9n)|^75r_!bP%?z zFK;S{V}+gU+;ScJuP_bP+vJ-%21`p1e_~I$4pu>S~<4G)58&{A6kbz=cf#Bf^V)TFzqww!? zXUMqVY7NjvY8!5#)fo1vm5<1-%_Z&?1 zmP+GiGJ%an=**VuT@43Jzlbk3f)R5>|NPi9{)>fo;xKlSk-ed(SNy6BO1y^Crplo? zF;*|A%rj>NE4j?7z_Q9>Jx}IAtWiIw}vN) zrekK^=Vo<_jrYb9Y)rjAcCixE<#+b7^z|A)D}$`~)d2yo5LI6oCG=f+yIpqmU`6F* zH9`Z}r9bp1`Tm=GSE=_qc>`}kbt?6THWS7sU|H^D?Kb@(VHopuE??ZT`!=OUwn#4H zcZ-pIlJ#%43)Tp;J`5AEb@s*K7a!$t!Aq1SkS z#m7%}dy#PzTB|=KyJ7kIfUn4wX186DZ0I`c3?8Y!8=w@q++8f9$DT-Ns#-ULHuycvkeE|C&B)9*Ns|7iE+1l zsD(G$er)?>sFkqqQmw`X5FD%UA&oZlA*c*}G!K7(&9b7Ubq|=>j8azWCA>B#Zy%&_2{$H=Nl*=kMP1+t;h3jN;>+NDxQTqTVaUw@Y3r=4EBS#7S!I*ea4bIw+6$3H0fOVxJ7${ks4 z<=u-0H;gS`qvA^)YFq1mcQsn~hW|yg@wt5_=BSH}%fUgyY5f$vPFkN9EyHy%L(Qqz z35g&eU8za6~DQf@G4!tU{)X`Gya0qBlph`cj$apM8om#zb4%gL>CH`d4vcPzqKVOEc2=TN9ve2osI{D7my-O>-VJz6G*D&%q+Lcl^ihzpF@wlJS+L zBJjpCRUdnujkgMhllwhKtXj6Xo>N-l|EtsgAy=W7E!P~&mM;yxh9QF!?VNlp zS{hDwkci`LdDZ2|o{41rBx`bkWuxA{O=A5a8{W5jt=8RN%gPIS}KD|rQ0tWQpweUdGGvJ+fL zA&ED>$@>6*nS3-ASTEk&IM3?;She0Ks`Y+10<_>3O*7nAAIJMYQN7SOBIU*r>8JrU zjP}{bR{tl`v(5)gAR8lc0NV==>-nqaZv%f1^Y=J^PxJQzf3$T5ZJoh0ohRa}@2B!) z8Th`7Cq(7@$vl&JI(RyG+IZr0X=LA+ZPW?8F8&Pu1_gGkZwjomz=*z3-_&+QKTtQ) zm|>^&9TWlccq6Wd-It6U8jJX*^>9-SrmR?YaokJ`H85Z>v#_Q|Zqx5?oLFPicZjV9 zWlLd0HIO)GD7XMsj0|92H^M%<7 z#rp1&(v}d$6@BbWBdF9|{00g$*h|#MIbZ1B4&FXAfSne+v}4j>y!$=e`?gqSvWuVm zid+&1XUY9MZJc{Q=Ufjq>haHBW(%Z;Z>npFBN;ky&KFMVds;$iExn^h?;c$!{?uCD zAKmae{)PfB?Lq|cMK-3X3KZD_4(}lVj(%hLvWmd`A!A6> zhSv+UaX5CnaI)CR;(!A~SsXIdjzIhtV$FLj{(gg6pFa4^GZoJmzhvFewa&mChjY8< zt$@|}3huY(*koPd{uBCC6s{J#VeJ=@`bsadByfmcrnd^0uuOBq-6Jg12t2V&Gs6rtEz``524)htDW4BznI?hCD+~Tny9eLm6fUA2 z(=tuISxk`;zDu#LH_a!XcZ6k{{e+iqnoHxEHy?SvtZ#$uV|r)ye8Q@uVwHqo)qDX}Rh9XR)DWYn&L~qX?>c-5a$| z;%rKSQqG2SPULcN_`IP{$1SE!l8+^Gd}BJdc6DWr#EI%jRZ-)Tgh*Kk#nwpUMB}+D zhAHxc{z=bMGsW$OzmV$xuLvHQ@=Ki!&q5wcj5oeZuk0#+DIb3<;+p9dzHxhk$*dCN z_q>mE&9q74hFvqo>zJ0$s?}zd7y%QC0H_%OVAUA_zHv4HKJQnIlT(=rr#Y$WzDaep zzDpgem93N>?@@90gnn~<^L-ya8?U{O(6z>)ad4f-hOS&sa2GfK!lMgvKDe@AvatmGSGpFyvfROViJ8tEmhyUTaS3_#>;0CnHvMMuYS)BI*iqU-n z!dZVO-5x#ihT!@|jQ^YxJ0*=o23}!^10JkgRZ=rV3eDd>yuqGUnzKO?g}12#vT_xt zWK-{O=3x~+{e<2?K^&*>rP-$k)LHNa+bp#lpK&6Mp0-~BvUzY?C@xCnyd-+89#<)g z;Glt2RkXp~?d7Pc{3Tl|p%m%b^|!+}sD>ZJoPx-n{sdV>|IIU?jW~2O{o5!cUn1?cnl<}O|Ip{VA7WanFH-0$;&G;>^ z;xq1`;s(c9naR|I>-qZPUgH!}2W2_UMeCQhnikk9#V?C7_XlcuV1c&F*c$%S>~#I@1cjEhudbFg;J1xEE{icYItFZ!2vm`FgUnThGbhI*0&=2XWU z2ld1dW@-g@1=oBPX|j_dMwj9W{zu18(P41CNNsW`jEi}dX*$f2QZj0CUBL=5*|18< z7Y*Hq|8SnFzD(J=sHi4{E_$Rf!NfYDUGa*Ech*lMJeDSl_h4c2!s5~r@qLoIusE?eCWr;E^ahaFrUk=2DUyMn-1(4LJdi5Aa!gf8S>{p` zc*xr$6d~1UQiCovc63)K_!4s`smZ2LxF^X&dV3Dh%Tt>|S9DY8Qk%lvBI{JROG}I zqRjO-@@ZiBktjg5U|kYMf+c)0ZoYJjZplM9*X&Kon;;J>gB8-APoGESZ*~Cmz2od$0Gxg-;+R{db97YT#HHO zRQx$(9JcU?F>r~D370HkkWfq{!1mRq7*7zaXiC(yN3BN`E#GA3|0j5H=s@`q{x*wPC7 zZ??Y|g%Yp5>B4#8cHieywFG}*I-cZwpJ!`U0+~UuguJfkMEK@;HDNFb(#6h7f;UxcnOB+veZH!7~n^~sW=1CF1 z6?9nh7=ajl+w!XOh2)$2TWnqqPp|qz)57OhoM^Ged9P}E)ff7@@8o#|ueJI^nf{gz zcVX)4^T61FqRy&IHJf|Sny>I_^H;kp8Y3qC7JLzB%9q#5c2CAscnKbzoxfR{YQ=%{ zpwxTAv$pN@W36@pTbAqmz46{rb#SLSldc^_6{m1ZV9ljQgxTBgNsnu{Ttt+Yb{dR? zT}__!toVK$4WH<;wlT`+R+=+DkV8`J{hwGmcv|;yxdD%B(KORei;8Lwv%g{4w+lC% zWk0%XXo;0Bxboq+BICDk{#kC8Mu%HT>H6DDGQIj%J+^A8m29TDk~#e|$3(QR`tvGx zAjK26yQ$hlKi&vk^SzGw+W6wC<6%c})!)O`;;Q~g+DbXaBnC1PKnItmNmM#Y^T+YZ zN=rZCmQxlQgyCYBXZ`K&6!8tcx>!FNT{T-+&PRCA#H~@BcZNSF;++;nLz|HOs@Ju^ z>sas)5b!4_u=|0H9JqK0fgkc35G^{-Zs-1yFZLx<3X-fYIr0E(Fb-?g!mo3W)v%*oA)=^5u zNpYD&`)XB^@fO5iuII`3`NQs{e}yeYxf6%p)zZUwl#VU+(->Enw)J8>2jKp{UU*j| zXJ}WHlgwsny(scP+>Rr7Xyw*bwS!U~;rN1!V-a0^sg}XHaguKx`C6;eD|4g;N zTc<}5HCK%`?veap?zXGPR3$v*Z zyM--}8*iGA6Wm`wt1j`^I4oK&$n6*4=-kl?DlB8T8GgYX9MueVZqQ*%tH2@C)0hkp zfAv9&c5ZMPs`{$V0@Ql}A5sy2TMo8!s=KggL;*kJ2vy#yGJJ>w@Hqb%Y)59Bh&@`B z!#xH4jg~`pYl{e_t1(V|-@FiXHlkdl7h>2ZDkJxPJ(#R&6Nq_9*N6O{uRiw-PwD>V z90cp(p8rkW+lMuErF+AH1dI^eu|-Q2l?t_vXonWHV6fsxlu~1{%2zAZGgZn^J7aZk zwH+g&0ZZ7Xbrtrcs>%}oIHux&6c8*qqtueZ9 zOl7ONlPRHxF@3K_VV}VY1$S2T1|5XhXdymL}1^Vsw&rLGmCM9J3Pr0O$@^ zCLbs}h&JT45qI7%Y4J`-YuL1sJjPGn9ZVfBKu*|vbs4>hGH9U;{(xf)rsudYNZLnP z2MvYlr8cwEFx`ov)SNALIW7n9tb85@&ugJYYK{oIc{(eP6KVC|F`VKspI4JOizjl! zcm@+Sp*Zvb**y4z`M`dxbp0y8>>v8GdGhak?ToEd(2D*9LaISTHr7VoGos1p)S&#> z0-;2=a<8+DOx_-$S-35)nIDWhxV1))UJmo#z%0vS2S-va#I^$WKhR5{m!=Ir=}9P| z4hZ_A5`)=2ypdv3Ly@Df)1B-2nC zTMw(b@nEkY{=woE-N;=LMMo^ey+g#w;?%pXk9(DNnIXLy4c?WW$FB%02`Ewz1fYiH zpc!Dhe9nKFfauPW=2H?Z+7ViXTod+6_ri;e^Pz0sqchD=FlDMdn6v{De_}JP%`;Vc zwF_^Bog44adLu-Pe2Yei+*}wnwloBl%@5YxDcn9MIL;DdDKp)&thkj{X7VT(T00#U zMKudbD42h_Fc=#Q*?5hJ1t8|Fw22@I_e$DKwG2&hHE2dO!hn)F|& zQb`a7%kNl+5Hi>dQO3cTwj1@a4kR#VI`J6)BiuN^V=Vp!EC2AIe=u}Pw-GcdVH6I< zgXH_D$p?Yi86OOWU$Cr3_tIs={CJRxe+mSoVi6+D#d`4|$f%5UAQ@FES0aMH$>}X1 zgF_gL)sUfj?MT!Pwtq_JpYM6<%^;xWo1S9%j<6T5RIq)ElkVqT^% zguIU6F8-F<0aivj&oF9GXf#~uM+9d^hcl!<-p{z~PFc}dVtP@BKmP|9*wxts9tdWY zI`{8X{rd1KuH-sO1S2C*kH9mw3f}aFlB!!kt4W>#LI0sJ0SovL0c1Mo1u#2TO51kD zX6gG+zfcL8REw?;z-p}QxlQlD$;zMh8mRnVC-pyG8mij8H1Mw|@Bg#n0TL*OOM!He zYJPAgPBKuvz4#IC2Q{V7P?O#gg`|c<<1^0n{(|(Udm!H>jKTF?K-O=h#1%uV-N-lb zl1qmqSx%o(LgioM@ToV^lg8hd#+81DchwmsO2yX+55a%RnYRl@t{@*~pEI46$-Fmw zui$m+?qqX&(buj&APu~|4O^GF()ag)cpQf~<@?diH1+NOD05<)1_G&U7X@;TJ80a$ zfjK1%{i=|29&UJ_aq-iJhP$S!mNAQhGD*UKZxhjL9C8ws#=Yw4p#+A<+T$X)%=0A>nOMVaWETBgt?xt@7`o0)p-n zC=nNaEL9HouP>M(j(4Xp68kLyE2t^Bj)M6~$QMe&e=OMsM0@eB(MY{4ZGNrN3URdX zU-YyzX(9NsMn~`9N(2hWH4f6)NeXYF!w8)Ow!*`>0}b5%tFt=igpShKGPQiJWts}M zK0D==inNZYr!aV7VQ~7>*`8I9S#QsfXp)ZeOA>;i&2%hkM^Hm3J&ICh|M6qGmG5wB z^VJTIQOg~`jKM8K6a8_!F1T~%C_OZSa{Fy0=*bms;J z8a#|fLaMRbYf6qAS&7|(G!_!&EnAuE2gF%8vw}`CY&!Z%XQ+dz(fPJPv0C)1c%4p_ z;ytuD9SPnscO);>3gi5{0MdeqtUlSk;t*DyOnS~03^z^+gomYP5RWYcyjw^qiHyr= zrxH6z-L!+GFd0c^(-{he`-i2t0kJ~w7Hb=8MOu`u)??BuwUydAXBzm%sO2Y8PKM$D zC9$D%PSPli@EmubQl49`!u>X?M{F^I7s{`eH&a;yhhT1h^IVnyKbm5b0)b)W!;$#3 zll-;BbLHK0%g=HLu-47Tp!YyN6p9W8jw@Y@rV^MdY(+1{hMZC%6yWxrv&i2LI36iM zwbJnjc0tizp$#OHjByuieiAY)SO7ixGnI<&!HIvv77KPcx@MA^c*Q;>|0q`3kz!g; zV!c%VbuToq7U;!{@lT5xaZgK;K;c?s9w1seo3{m5(8RWy^o?L!G&7^Hw_qz?vfP91 zN8g2$8uYhun&t124^ZR99Id!YXYKXy(_kunqK6MP@NpB@PO?v4E9ySBL0z3KO=sQk zF(wuFG5L9M&c|Bm2^JfUrEtK|3&>t>quCn>ilW_;#LDF&`(ONuhG@Vc)k2;4v@Us} zRtQlHnJrrQX$);Kg?k-HL}zbxOM_l{6+?#=!!%y0Hy1^OlYxc@Zi#H%o8gS}IAV&`18q_p-r*ZtHw zy&cO)weY0176NC`OoU7SILqjU=eoxVHPVbR=*qEGO4V(7h}?bZAgBbzyfz4+3`H>R z87)80w$=?_3;&i?sP#yX~ zEKNwU^T9;)2lELbG(Q3-fvd7eeJ~v@Xkk`;*kTZgDew!{=@d6uIOjV_SP#(@mR?pC zjIlFK$0XH)OEAkY14B$Yju0bQ;@3U=ds+5O_tOx1>Bv~<8MYi@*y4NxhbuTu>>*>% zhfqch)pa5C8gxY}`4WwUZSLas68uy0QDZBKv)~^x%pK6O(;qQ3Et^=Hk5A*{()dwn z{O~k>Oj;U0C{5rC_44q#P?lOj;XQI#;ZQlWP$LHyYM)(b-x!6O`RM}I8zP6;rN(if zo*!!M9*%ACZrC}sE|1ITm4|_gGcL^4TQ6RM2H{j|gBtI{g{lQ8pG9EbXlj0O8PY8i zYbv-WyTw2#+xK9YrIuv>@72T_#vJtyMdM7O9x-b zAr-s-7s}rh`N;=J+|bCq$)g;&l4tP?0axx#EN=1FMWuNhdRyX;b0swLrgJ5q;bFak z1;G2t|4qt&{^fMuXuUF+D;X z8M)+2Nh7PI9YP#D7I=282$3xPBOx_f$@j(0brtq|3E}0p5pg|>h*x>v(W< zpoX%&%9e;6yz(4WQ&9d}8{VOJy1I!e6q>B<6Rpk}ka7JTa4l|Y&BSVakA}A3aE6=6G!4V^EN1AvC-s_L31nHz=B}f+#1Pj^yVn64NO>uqE(&5Mc z0|`HAnm3t1zi|N=7{ByWLl?a94x*!5!(a7kK)V^R{YhQ5dQAT4x zD(7$dQepI@#3|X3YM8&D#v??_ULUrPM&`e*KlW%JjTU`Kf8kv6wwttm^V5v9t(Rh|Zni!48`q9YfkUsSV z>stGQTaOJ)WvdV7r%{Q%f%*GsY$6&9eAqr3nSX{Ki|z?PdWU3yCnF19-X3AR*DC{^ z9+{7~ka=oL5ufn+a#LEcvfGyybhT(Dl1#~|()!baXQY(XFDmM$2muFZlWU#q#d4-(q-xi18Dy*^4~Zh4VM4E3`nD8!@rdOjV!GJ`TuFZw2*(6 z)@}KpHGmG5|4IGg-j;vr$ZyO4b@Xlh@*lt^k!)*hVor4id3qTIlGMaI@LaSI^*ekD zo$Y)`KU}F5vkr$8Zgp~&iX|8XG4osnFM@#$n8kBX5m&NA@q3v0aU~}F1%pt?EG1+j zW)-DV6*op;u5^Op_Rb3`XFxO|q4*NbB;s4vJ%{vtAz^_bTp6i)MJpUnh`tc>7PmR#qA>n-Bg5k_w8-yvRnhEE&{7!uqFXn_O-6c? z*~|stBnrNIZeKp_l`Diuf?;0vO9$lkiM6xC?1TiJG`@#N=O527dUW zzi12wHF1a*=POOh3{_VQn*vV%996t7%GwxoK7t2<^d_$>B~Fgz?&-%zroQF7y%NWnJkFOu(uo zIvuZWy;j}&17!7esgN&Q56xA>N%xRe+LDTW_379f$i;E?5C~O-(k=rG@5&G@hG@9n zW70`~MGDr(J-LVqZCXW_afPLGo-P$zEpD-uPqr38BqtF?q6-R@ALS0HJ=l7o!xB5< z&7Ms$g-GfCUTk+IO%R4cm35s&EAm|I+9A0nY$Imc_r&QyZE-t~CBJWfs??1>M=b5Z z?;`QHT7b0ew%d#~wmcX%+ha4g+sySgvt%NuqrI^TN2MB*lKFmx}H%S8rMR_5#&mPquA7L0h78?;2vylcTL7K z-+E&L$z7VfduLN23S zg*;Q7xs=rOL~rn;O7MzyPZ1<85d07eUXIDeDCYVpT=z29&*2)(TmoF45K3k}T>oIM z9Jpk-tSh!5mo-n@g;NmUp+Qo@g;tNN31KXw%egmy4{xp{20f~^dlC2M8G!huR%s@$ zM-|S*7Y6IN(qgc%wJN60xRp`?gCVD>RusdtE4aV6)_pi0jP+MVvd zLKhCiomMzirPx4j9P8AcCmLV-YMuo+d&|WCz zoF9xG?Nj-53lL9RXq}NAjJV2)HdHy1A{l3v2Mbp+2V{t9agoMat##3aSm4m`UJ#66 z0sK?RDal4@qZ%?RkRNyt9vkCP-^F!#2+WqY=F!W=%=0*V*vp4ev6-Fd&anx|z*Km+ za8oAEh79^MLa8ZPqDdwXSIIVy)L#OJZGkwV-~$*lhpH z_s9l%NRLS>tt<+q06q>fKoB5Wlr7bujaeND*6Yc(yb`fnJiAe?Hti`JvOqp!FQu6A zwR72cOxOIxdKZuoKAqSb_lw~L!d2)*HUp#Qpv-2d)@I6v)>(zvvv5#pemX{ z5010yAu1dHReWAE3Jf;rJwgp`EiZyHwF7M3huf3QqM7{crbALa{D9Nu^26}Z2we7} z!UTj#oZBSKsN}7+*TpG1E+(+-GGdLfqI^Wy(V%x$48MTq% zD(i~9IE29nkD-QMg^dN#v`xg=+3dQ32vYh#da+AR$M;?<1Fqfh?l+%6V;Ai-g;6Yl zx*fexOxJ<`4b_XDpR0Q3-{z_+@D2URT-8i`)A4-`-xm>vIT%^syh;W*aWDS@E*1qy zWLDlwML_rRX$u|a^V#c0O9%U7w)-(9L}LTaw#!CyZ#iZro3ya2DH3`tgn3OmtE1O? zeeAl=fgqXPCZ4Meon&7SgmYG^ zA`QuzJ*&^+3WC9?T}{_o|5w@lPn6$R4y}k!lnt6^xW4)ac6Gm@N=I44#S)k+(F$Sc z{`oqvi4|@TV{FaD*i~Ob0QCu1+ilpl|cyBO{0yQ~#)vOWcRkPK1e(4FZ zUKrJ7#Mua^!c`Vh{)%3Kqyn~tSddI!b?bL9YDCs~=7^40p){ProUmP-S558*wHS*- zsNYlc7vS!r9(0JNA+UKA0?S`2hf`C0k+XO_;SO|Ty|9DC6t^UvD8{548)8BjSp~wK zBc!N!c@!_QjRcVb(~yd8v>;ZL%=Y6CbISk?dMYdW(w@05?!W?JibELWu(sA!ei#4 z3p&0+o8D<0qUSH?7q1xdy~p6-L-UJGLsS-4=*%P(rs7~&KO!6I2ch$KlTNs%7^KobiQOFH`QXOeNIx4+#$V)ZAIKno4L{uLYl33y*P|1mt43Chv=325SXg* zp15NzMb`*(AvX@8CaAXQD9?;6SsXM9H)iMx(LMcc&&C?{w0gk1aSJVV;5Ax}QV`TS zq~C$5NaUo@>shE`+N{Wn9TrFWmQrL2niLIe#bI!^cvVPR1f~4*vJ1Aon5HTquEZ6H z9Oe97Ynx6ed05|}epp=yd10D^-X?P6SeziETAskAYHh0Fu+Rz3tdO3IccdANk>;RO zn=x`H;Yo6vJ##7;*5?fJq$;39_FLnSYU>tjBLgjaY_YVPPdZdAZUoYT5na7 ztefVqz|w7{7|&@%1Hv2d*f_h;nRp_ns|)F`e#|~+hITqF3fJ8${Sp%du?B+T(RDa{ z#8hc$hBWD5FX^(zy)hMCowHVA_R~S4<{im-9bAc5HmXDEen)dg@`tT!CCnYy_W2LNa+I^5vY-~=9+4rftQeR9Oy`0j{CAC?34w6B`{yIh zSA}Ci&!RaM&bpWw9PPcYD*CnBrlsX+QefA(qr3c2NFVqcUrBcUAB@2o) z`&TO(b1=kxZu0w(SE*WOsa8dIJ z^QyJ4aN;PP$+bv-18H8ZTzYTU@Hp~vXXypJ$+H%6dhDr_ve{EFJ;k1p(meKzl4j6zs+7e3#z+b5 z87GZr&+$?Wdrp+1*fT-Wv*%<<%bwAaianF0?nCst6v>UJwIE9c9l9>96d$So(}TbELnp=Mw3U?72*OpFNjLzh%z?=`HqLDcRX`l~l@}ykut2 z^^(Az8>E-;Bog*pz+ci*^4(8UUTHCNmXY%b=G;uq$C;D5Vkwb1NyJ_n&z#%HIf^-H zYel+;Id_nA5OeM#XV0hfirwVA3MWpto~!oh{G0*>Bq2;=D;oYugyxEKHHMHLQhy2` z2lIg{yD2J&*Aa*OC;9Zn-w5R-h7b)4%#i+FNkEVJh1bWT_(U2)bY7pIDLzq#5WUxD ziQ*G&2#NIiq$@r#hL9+)PZIN48)ujj&3v+?apd!yS9UeayQYEpH0aqPU24H$P_ALE z3gSM}#K~8ovjamu{GpA#Jd_312669c;?{hJ3uZMjP_98e6WzKb?N(Tj4uWjuZ%|~` zo0{y^g8dggrJl7v!(<=JfO0)7C0QMsk`w&X(-!s!rt*wiaHmXLcuRP!Jfj!xanly| z3J;WLc;MDgLt6~D8hbR!=APA6@(gZ&DkfD=c;vZo^}^LFr@(a!u3OlS-k;h7SC2ei zd7I3Y>yb+2w4s7NmDVuHc|EIfF`8t2x&6>vIXK=S|KL?c$R5bazfc~chZTel`utcy zT(!>yYj{h-+8#yy6zSK@`WCW$d0PAIpy@R2T8C=~lA=bGJD|ytg*)oQ6hHB9zxniG zc9-Q{uQlF)KFlyug4tbbyzWo;7?_q|9`Q;@y0y_c z%f6x1SvUs9MdBM%PdYIrD;=bm0w;wAjh>U=be$+&T(ooDY`BeB;QPbd~V z)V?~%KnR$X?hRUl9X7ULPQ!ZGHWUN>E62%{8uZZCdrmqZK$&+C3Fe4GbuQ5!U!Pcc z?IX6544S=j4stEl$45}^4XtL_2w|o4kt+hTZbJ+ACWmJ{wnBwdVm*T1R|@BS@i@vy zDV_Jd1!G;&!3q_(+{DI{--4_dw7ef>_H>;g&Rge73;lGmt5xO-LQ|Ff#nsuEAcH~Fi|o-*9fyINzoLG{2?vfGj&|1FO} zm5ugS7v_gQD7B@=^2hdwcr5Leudwz~stC#y?^H!%#C%lBOdmf6l=y#3ffr)WF~>zZ z^$nv^iE9{n+~z-`FnwH8Y;xisZu=@+^50GJPKD0Jpw=E8gf%TQSG1G<7q4*AA%(i- zU!b*#`1x`GKc7YoiyQ1tTnlVcxcPhdgqu5TU=`dHfBv7z~2V`*$95WBK+ zJ$VVrO}bh~HlPDUiH5g|5g8ymJkM#po(d^@3}KmVwp@*EDD;qAj}b!PW4oV5lmEUR zbQuWzzpn>ff?QJ%O1c04SP%NoD(wFsJ?L^&%Kyk7G>5n*g2?-y-GeH0t^}QdJt+PE zpWK5|x!$1%Er9pG+JkQB+up!z6k0TJX9-6?P#rjzPBr4Paiom-kS%YsP1t73+h@z$ zZOhwb%iCeg+iuI-Ys=e;3t!vM_4d2HxDogIagu-;>HRoWhYn6#=AQCkm|4@o%$hbO z3>M!a1obRg{y3pLc$W2gIQROGG5^9fjdUBdPuE*qk65m2*M(v#mo8rrO>yF2(FSQZ zl{k1BYy=jDTJz`-lkVD!P4b^`v8K+rnWoe7yVez(AyJYmzwJxY zChT7O;lKoG)BcYzjXpkQ5+66Mnm?E_n|mV#$)y-K>QkQQ-bf(#3hvGEcov4r#p#9N z>|Tg3Rc_PM7-a_}%atsK=QM2a5f9R&D;~wsdgj>;ZW;kXPzjhChf)3E6~Q!Z>U}nv|G)ryPZpzho(g`%?CWn%m@0 zCse24)PEQE`p=L^p~m$)EVb?Fy*L^6aty=!fYK~Fy^OSV$=^nh4 zuR`koTZCrT-8hHXV$*XayKp2?7?qQ3+_zS5F?WS*Q1=?Uo)o*gTB;+-;x#NOSS^4BYK38mtuSB{}5aLj1Rxw#(ru z$=sXIB11~hRo7E+drbTAo~JA`R6JCB)L=VmpWW!pkQ!-+)VMv71geuw+swhx7-rm? zY}z5HVdOp8v`bLO8>6SwySO+14mO^?S4R15z7FT-meaWB_uVp*P1?hi?1Ps%qO0X| z=NXa=*@KW|6ExN4+e|gdCIEf~01n(8<~?d_?P9BQ5DrIiN?P(V{9mlpscXfS{9*&G z)V8dS6tCIM6>1_2 z4Q8v0>?sgM^1$vF*fPKP21I^g_>G*NTVHUmlkz?|znHNOizOyKRpa`W{9r(F%)Bn> zKEb?F7-lusLxRF;u2Bht^B*uZxoUwS*{KqzvgnaZH)Y_8cS)@;#weAd60 z7u z$7RfLO{W~+j5+QKZ(IOT2%G7Ya6DPq%ZKFSNIfXO7>DSVby(k?D!%CP1d%xgOAzG$ ztme}mVS;tVY2@*&M;K{caTe8M{t8>0gCRBWmC7&EH1U{d!ux7LQ#j0!H|E>SO{Albj#5|DtH9k){-rO6I&$SBVXz1f29Wl!O~M z=i9h^+dQ02Z?&xpwq?Vvrq_(d+ zzKZXU@MS9izHj`(URZQiwjF1IW;bbb7c;xXMy9JNwjQURpc1?bW~wzdAE`AS$M*!j zC-FUn@0a+V#`g@qE%>(Ld-i6n@!SlICd6Ad(^fvTc6RV2S%cpgIlweU)X+Q4=mR|^+{VE$g%z*DK9(hILJ6tt0lguyK&;P1qO^Z09@ttlK1 ztMIr5i!Lg$6T9>gOe3Cj0|%lQhe1V%JfYxJA2#oHY?B`g6@sqOAQWghZJSk%zm-bWG~U`{(h+4(Ty9y_1qV&Hq*Yu%7fI^b)B=imKj>|ZJAeW!eyKJ z8yvMeZKiEp$)8x)caS#X*jn>QdO7dxbi?2A$fpEx$M! zeVu9h>U+hjc5}`9@1tKvcUNmOZWrsh1FwXMnOC5cDPay}H8C|%xk>gL?2+WhJ0Jz2VtFm`vj(zbkr!8|gQnFTQF|9=0mo1tjil@HSR{2w+CI`UaNVps;FY#Jdbgg$5d%G zSE}&xqOuUB$E&0suba3JJzl088Y{rd$5*(iqw|E{K+AD_H%5IT{B#K2tR@j1(4W~& zJzize(>_mgn%LY0Ef46h52>p-K&?Ry$d@*Gb(T?nkk152#eu?cJbmuammH zA0TgCL|tCy4`4&5m*UDM84?Gvia@FYdK8u#YI5#mox&P{gLh#@Lgw*L+NN5?f?8<8FvkD$K`*R@$-5 zhvHxBHF78eD+#hG11pZoCD-2>q*)k+G1bRtP(C&!*~l2pc*S*`A>2YF5G{-q!;+1s zNb6iP|Cx2g9td}K_}OYt09!$bwuNyPI4={`0+y>#c*?rs5XR8c;wp@x!wp}7r_K^j z9m1PX(1%pE9L7*+niXKEU4Dl8G&R*@+~Z}aqF*WlXkul)p?hPBkD(qWhRO?IsB__G z`xweQS{l0P7#tjhnL@XJ3^jCP46W;GL1R^S`}hg1qT8FE!cQ`#=i{d|mW~@^sB!my z!Ay@>&0wbS#7H*d55fqAk8H+HA1f&%Xdo-m2)cSS_(ka#eA`qC$ADWPqcauKr{FZB z6T6!><2N|z55I0Rg44`bWGCaaKrTZZB`MNKD`sM1voGHk#y`q^(GX;cOg2UqJ(O=9 zODw)sWvQK|4(c0CW(C*I!bmbJMCJPPbxgd6#O3+XydAl&70ph1 z`IRwtohlrL7$ni{?NmgEeez&XW!K#!X4W{q9}^B8KhE$jdrGjOn{6^j!N5)82}3P5 zle>e~sIjq)(bmle!4g@$Ju<;?8a)nx&1-^Ys!d0{(=+?z8Km1(ID|rWKs342;z)ps zPiaiJ8zzM@y;qh^ZM8-jGxaCYlAbJAKbbPcJVZ2A%5yA+WMOcvI^jt}Ugeq}@FN;` ztkKNQ_o#Z+6Iv`#H1zr5vK)0SG)t*O<7WTlW!>8}d9fH0gpemO740;%QpBVA))-$k zrcyOl^)_0*iGZcuvW#E|lGdi89$k=WOswpz*7HHBoz+^XxT@E5R%_^~?W~3xVr#v= zvl_jswLYe+S_M&lat4csKcPETv5i@ulh68&(PvVqLMpsScKwBlu>NmXGEq_j4@0mhQD_@ z<&4)F>VzTTU&>+Or)7$Vt}*r~uR|_|P%1$x=8M9~M-l3kq`??GF3ioxExOvS=Gdy( zrf`R$3fKA|zVruVPi&DQuvkX-20uM6#OWy`%oh3o^NhsS@o@^}_w`YJ4=5)(!5#tB z>rwac`R6&PvcU+D*ZLb*vI+UdDV|!Z7JIor;f^FOB1I*3!aj()Q2!jHnTboAv~UpH zHj%%b2Of*cR)l#iZNiIJE#d{P-2^}x_zA!HM;Pz8%;VsVSH>qPA7@H3dd!2r68L}R3} z7}PUR>=Pwh7&O38Ug&D$_{0-RUY=oU)k^C?bE7XijlS$O`m)m)#7sAq*7|r!tVd?X zdNUIhkQpj{%1mhZ8ML$0ccLF`#OS9d(NE7{u?qYXEjA|}4|jA`q2Mt`ia>yc%(Rf? zVc_98+zajV8(xx3V} zA*@JaxVBm&R?ER+E%sr02=L)!YH~Bq?t3lb48=^?Gc+V-h(ql2 zhsKo;wR}@-X@p$4{7`@2*DQ^}vSj%;O_3bY7h-w9LI>=^Ahybu!huT$C z-7}LU!YFAyOnQ3tv@<=5&p=NP)~1ESbD*a^V#iNlp-ao`k}QtXGI^hDD4K(1(79w9 zR1GcBPeBfp$p}HyYN5ISgrydA zVDYXfT78eydsX{1h(SP`wEyyCR)_2`pWe9&!PH9pKCF01637JeOWDvKzg~lXP`kDs zH&C^+I~{u4dL2(zTn6W8>Wum~vD?t;2)&8rTAvpbBn@2F!tKZf0&;Y7NK0_AZKU&D2t=s0O1u6#g_3i{)) zuEov@HW7=jH=*9l5l~SkUOOKl{bim?UQ9P|+{z6Vjd+r-^5L>YC+=cnm4ZcQX9eA0 zG1QyK#yd*#+vp{LUbcEkljeGDItdvEJm(B0kx4r=fb`!g5@^?{oz5;pZkT$7bibC2_iUNL#=Dov)pW7mD*8 z{6Uw>hn<_W3Lx?!n>d48ziXAgx_Y4n|Ih)o$`pVLRE63CCn?l?>kP&$s2(JnM0^&q zoyw;rhipI!d@3eT+@ByH_b~1d{!>dz4-%e))4m`)BzZ7@@W?RFp?F9FUg8}q1Gddc zovhbl;hSLSENN5_m;h4RU-(QG>X?UOvQPy#<|0}4Xf^|p+$w+-lZ9%GeZgW~d1_o- zQ3|+`jE}(nApwvYnJ%nmZY7}ua0e#z`@19rt0bNU8i>}dA0mdrzTgmUf6z?Z5Lw54 zUY(U8z2|~tEp8CghF}CPinpV(foI^PKyV$vYkgq;WWHGKssuJmdN_ck}QA3$K} zZ3My+jfH;>{S9{D3PY3&)>F1p3&I6Tu5=|zpXMR%jgyI@d&JQ4`J+0@F!p(~FogSj z&ZrL1^%d@Cu}p9!nC5zB8}i&6j$mU+E5}&pYI@g4u;DTvCQd?wY7yyH7)^Km z`w-uk`9Ff-yYzToDG4mTUWhG=rY?Z>LK zY=VSk)8h;p$rSg(gytCe6eRTRrZy&*jm@Iu9Ifz>UqC-wx)2WDtI;RrxxISqVYZ5t zR?}uW337GWOdUz1`9X7^fJ68PZZ{qbR`gBueX|vNV`EF^7iL74e}ct9ec^;0TaXL$ zRGjOBsQl!-Za!Q}LzrUa4*e23xV33^eo!yHBGUH?*xW+S(*s@+3HxHoD8AVU`WD3W+NclY#?KErcozlNj-Qv>2D&v90}3(KAWyMa$!fxmn860h-nKGv4~0X5SFnOKC(BXHyzV{T2qK5t%Gd{bHax7H^8A zv54BGhHTR&fon(znpz8L+GR)jD4-x*Zws)1*ml~x{OJS34&!nN_BC0r2X8Rh*Lz9u zW2aaz zuyAkSk_?RTDd<<0aE}8OxP*)GcFTMpxZ|@Y5cv?fyq-L;!l3~Y72t&U?ozY56j_m86XB0TF}e&y&WaUSu1-LFJ%Qs zdmEUTLM5^9D`DKEfq~k?Lfk%2?93LY(@k3R8R8(=H&`K#BK6I*MlSSZWMz3y8fvj0 z!Y`&921`bwjn>izNe@38VKC8J=pTMv-PmT{ieBiRWcyFnCm2=+}13PVY2bb*F4FKFp51Z*^cI$UuGp}1ib zEY((Hy^8@T@u>7N1cSUnxs&^nLH{V4q9BC=W`-@tW>EzzwC6FdVHpZ_;Uo=0>VHmg zB}>r~#VI9t1q9-u1RHnF#8Gr>m46NzAcBM(X7U5|M3>N>WL`#5IFGFquR$lO!WQY_ zQ{X6f?p#CH#%GIr*1tz})LBGqr9;KQQdvN9Aht-%JA!SP zQS_qdMTDR}NVzGB;AOTvr~GWP`IJ)q=%MiOqZmDW3e1j5xv-}KQosUEJ{}OL2k|C# zlD4X$T12YcM73>p%Hhz{;Nc-G-E2d)+NAsKR8dB!eMP1Js@xao_q{cyXT7sNE1N6% z64~~)&aiz@@5DAy4t?Ce1^(`Yw-@Pa1Ii}K+lbBfQ24{F2__5rwc{o8faptakB%m^ z%)6B`3d>QHkXE_}?2Iy{W;MrW6u0 zkq-uTKvDfTl-gplpv#7ikp-z(Y9`oLX>6;s+@`t2lX@{nBf6PL$@^j>PSETr_t+yx zh94KPiE)iiv>L*jpd1S}1y{7I#Ip_=K6IvaSj=;)J8_79#-1`7{d$5eLt{&W0tdrQ zI%{o5;@Fu?&TF?N@gvw>7vI&1bF-m8YL$l9%mf}PcyNYoj~G%g3L za!)GVfC<8;3f^tk%@EJfd0WazoVaHw)Y+qP#- zcM!HhhA9suZdH1iDk4qGH$#3&%D1IKvdt?nq(-x3yt|MVFIm!y9lhAU){*h@*K%QN zD*Vqhc^Zrowl2`cfH$Gq$$$dioytc@-$7-KvOttCVhFp>ny*pq#*$eCTwI{FI(uzH z$a48y9fh!4cCcyX{QlYS>iiFNWYiosUngS!7MqgTzSBuD%$*9M94I)^Ny|2|(UPpD z4}~)~ziX~e8-%uHr5DWAijUjVf^9>@1yS+c@rNNzwm`FSR5tdxbyE2_;$Izld3gcO z{O~H*4DdK+&$RVE(t5oYM${Z$OEqlD^Gr zXmY}P^R%$BE{`eQ{`V%Ed-!mFp~-{DemhE!8AHJ!L8=KdNlch5 zh+-ypQqZ$?1#4Y-)rOOpgU}x8x{=cB|H)K&YE-nNjjR&|2X!pTa0qg*2@v4!E2S-~V+?y}a!p^AQ zNLox>%D9S~)im~EJSwLg{0IYV@M@>U{2lfPzvIu8X9VF^XLEV@H1uE78rS|gH5IuN zB>A&sbJWHpLa)K@eX8poB<+j!y%I};6hir6MAS}eU(jB~(NBNW7;gDE}t1x_eb8&egX4%bMh1Fp7@#Mvy=Q3U^u#&VDxppN2qYZaS~ zf$Aunvc|f?iOIGTDy?=SSxi5jwC5?Dr$HYtC505UD@F~6F1ibCerj+j{udi(1-yT% z_x;1A*V^!Y+_dGN>8Cnj6n$VDR4YBw3Ah^*qg<}!6KsPTV0{aB z`U_E$q%`6@rVY{3A_BGGo;~E9O11)}0HOeBV}M5q03EGS5Hr**lJe2v=DJ8QiW&%+ zW2I~;h3KQagBS>Vto)Eg(p2EHr38wVD?&L#y?@$~w!UxL0di>>u=68S3dzx7G9CjD zsuM~dHKdcCV44}C2HenR4cWhrScU{}%K*L7$=lWuq+LOo#dQ9m|174Z;V!e7tt?94 zI^s0e5eElEen*KcKZ#k3n5M@91}fRy8L(*2mJ;uy_%IQXXLwd&bI48J_$sRjoB-WI zhH+sS3yG1^QlzY?y80K^6kdHi@>q-)Wbb4fHr_E{U|Jr5-6hSSl<9nQNhKfUQ>xQ~ z?S_yxtTLW+bVG2xI`A)BiC`zyBOVii8>*8B;R?D#lWI*?30;e_QVTU1(%*&>K>?hoCVRQ^12|jhq16woA#AX)!J-;FQEnUp zuKBQk6=c@4Dxej`$}BO#a1F2F7Zpy=k}TNthk^>sc02f47-b(%Y)Hxp+DTdAwmJ+U z60Mv}-5A8WrOD`1-lGtd=Q0dOd|dJ z4?c*OdR7N_wTg~spIZv$agZz0W+wjKaDizlnVtocMQ4y*(LFaydVCce-G*D((uu*$ zL5ei^3nr63((5=mrh=&>6;mX#p)>^l+4NsNV0j}QGQxQ2dHf69+Au1`8rTs)#E{1% zw}WhvPeV77A(f*bvC}@2+kd=s&Z986HzKv1%&tAo?7E$BT-1g)CYy9Zc$z#4f~v`x zINVJo({BieAvU27PYTEWOb_kWFk5uAThq6i!$G`n14A)>N4wHsM+l$TXL+8jw(p7q z5i0xgIEb~EL!bX5u?0p0VLnak)fPRhJPi6QFoQc*(!eiNJOw$tC0nd^T+(NSw}@e1 zczSy`iVm?W@vz#hzHYthvAR8p#}aF;RZ!KY3JNL~qM?C3sF*)Vk03!?d>Jpb2sLQG zIL;Ag^

D!RMxr(NP7Drw`t#oYvW4TINtc!k32l>F=GmMS#Q>P5V2`>b2aqlX@z z2h+f*f&7K-2iN#R*FBUM`>b{`T}rH%e)V#%r((w@m;mC@{{_O2z+$AU`%@pjTTJf& z{&~V5A^e;>;p+$D6A9l<_{iJvcIWpv)_BVo<+V2a70byJFS-GKgnkb(y&Hf2jz1M~ zuOpSFb$%-Crt_{GM7EnwxiZ-Eh%1df+gz0o-01{~=dBS7qi~7G4KFyCmFQ&HupGf$Lgpa%vKFW{x zrmrS^4&mDbe@!bnp!`Z>eEId_PyP(}62kAh6TV^~{yoC)C49;4`17tZ;ORXUe>`tF zy-4xeDBgTuJjQ=se8xb$f$&k~z(@Dtx4Fjqaa+aoEhwLR2{(su9sF(it#oyd_T~4G zm|g+=rI&zTMfjTA@sg|FkN1|($AsTb_^r3&+g(u=zV_WArn`~8mGJe1Uw%7&yQ{#T z{uVKPGw_QD-$D4vx8dz=IBIuIK@_{anVb`Rv0tmlU$LAl^&kxnX;>@0Z77%$94{il zOKbWU2nNy&>3^@rC|k{(zwdKy?{ofAaR&Br|G5%LuB0Tl1SU!9I~-B2VFyqIV7ZNE*iiU<0_*2nFNqyXxl()RjyDCO1 z?RhVrN;x~l^z(@J4n>QyBiaUEG^&q^7Q&x*Sy;Rp*LwDBcCGTq-yx=NNBn0g{t}9x z;)@S{a7nPGpuERhKZ%4ZBV42p=c`o4#NVL513xpS@kUWmlzkNCA_fZ|`p6N5{}ntn zh2Qr%xA!@J+2`EU=lq4@WUujZ+S@faHxG=PGGJ8nIr zlGdKS;VIbBJ{Q)rHxTK4^cDO(_LzQd2tAetT}y#6%s`GNR-1kItJ`Se5NAI!K3 zd@v)4@KXcv-Gn+qKZpGI1XZp|I&l=~Zy|hW03I6)K?P9{0p8<>&;Kk>C9OF^ z`5P$CONWVk!q4l6*MJ_?c;MUocr9i3W5PER{=VDr;|Z^$A4dO?AkbqayuJnaZ)pwW zV+rV%%_x{p(8+$hP7nMd!eW0RP?( zMiyB6%84Yp z&4eFuCw%lo;I;Tc`5&UjxQX!k^T1!hgx=2#K6=s!KUu-Ar@ktS@EL^v!SA8QQcHOK1>hExflHU(c# z<@0O8!-6sTe@y6a%WvEy;Pv=H`Anw9o=^BKgm1hPK7;Tn3Vth<=Tt^N;eT@{{071o zD0me$#!yE8SHKtE3BQ~0TNQi~wXD;%L_guD4Zt7N{{!J!nwy>i3ynP^ZVMkm^u2=c zEfjtO6Z^pYA56LdemlLg2je4!pB)(9Of6|#2g3JK_$LFyC29l73igj-w9jQC7y3r~H683ciP+?S6a>;e%Nj6MpJ#`0)<|A4NYb{qa=BC#cNy zUjrW+fM@M<2_fhB;ckMj`70GM!Ovh#;4h*=O@ZZc^cOn_UFMHc;X!|tN>R2@lwJNP zz*pu0e~O@$e*7vL67+;`COjXASDAtDA*kfXZ=qh&SwlH+0zW4ZZ-FdM!T28oA4xwf z$9t)l*-Q8g!bb+;Rk+Gmu$Z7Jetad>nuYLN2;YW@zLI5(e=4O8RsxLn&_nGli;&HP z{KSt``s;%31SGtL65ilXeLMBmPg8F77ZGPuKpX|1@(A$b>4#CD(FN+qvI-zPEn9pQ z!0L-9z513W9F)<9D#}kMPZe@51cgmptJgEr@#*crE=f za^_GM_B`SB-vD3NA78-gYcZkc_@i`R0Z9oIC4-`D^+!SaPZpFBZoMC@C;HWlegePX z2UGt`_=-f}x6_YOJk*7qtRnge|5!gf>Zl-TDxi_{!|*D?zejleCEy43!^8N5Qom)u zqkh*@;jATa27%9F!tXB}qQ{TluHegv)8-O>3*rB8SNvWDzl8W_I3u3$uih13qu_JG zQ23V}M0^|Y>37AqDEJaee?Q?f2tVSkcuB##sc<$CehcBRV6AZH{B|q&cH-qM!Z#EC zle^-zkFoL`PviGEM*rV{FTX23O2Ic1=X6#Q{e*w!uK4i^K8<>kTEcH3{DiyWlN7w0 z==n9_n+bn|t*Ml@OTT^fo1x$QJI8wcPEngJ_VPe04)hcR3`_0Kp5C9LLCoP$kr$qTZ{RPoa;Aw&2e)KO<@aw65KOnsR zTj0a)ieIJRqdHMOYYCr0__NsBx-&nNDEM78UztnzErkEWUGdu#d_9%_a7I7jU%e}S zw}OwR&gb&yM85=l`d#rA3Vs`v&wj!~AQJq4SA4yKPoa@z6XCZI{t9-k?wsEi1OfS52;jNwS?b7_z45> z1zP|sNTQ!O`cXPis)H()2a3~)?J8fM4;COjSJoe|d-p8R|1K}sWkAf$^uwZ$rz!9v zdZqpfq8|u|exzW03SbgpPx&Kkqc-$3y)T0zYzl}_P(b)p`k6>S>;+NZ0Y8@TTL_;O zfM?_1c0z9U!z-!Es}BL*Oz?*S;21v&ARnYEXeRU?e-tOpSGG_TJ#A`qU@J>0frC*! z$Xr(2bWq>=Mf??xcs@9HS?HGTMHG(R2(d}3w67Nk`dLOzRue=i4< ziuab_=iL(eDW$(<^s^a1bs>xK+oPL@*5*&`$dQ9i9nw2}iKVxLrAI!iD7}^l#66Fn zcQu&Az8iv{_q6n*!%tnvDTJ(yKzic>)7wVvXDa9`*h@JL3kakB?x2(MGu(ynN(#S% zeJdX?uy6~FKf`5&H&b}y!0=S6tKsbkcT)Ht28KI{|EG2!+)d%-1H)G_{{0@|D%y`K z92h=62;2Kb^)y%7e-+^|6h2{Kxc&gz>)c+1Cs26U!0?zVYR{NUqyAKX zpR0Pe1s?C6ufdNKKT<2U(EQm>E&m!gIc4h z3n4H1?A+iF%k+hj7kzyDIXhROzLofo_%P%}pPdE%uwlM1@}f^)e9VuO_*b9tzJC?G z=(DrHANHj$jJ)XMkDr10i4y@8mydC|uoe^!Y?v>Myy)YPuR-hf=0De)fAXTw&K|6Nm9Q^;VdO<0 zfBdbOKPi|$`!M81pPifiVQ=}u$csMy_~ZR$^s)~_Ui8@+;}6U9g^?G1{PEi{UVHQJ z!;lw!cDDJ$hWWzCi$4DN6Z`U?>~#9WzVwBW7k&Kkwb-BV=HG|;KkU5;cofCfH(oQDgb;QF0cB~HV1OiM zfe;9goy`D&5JUu%$;>1fn2njqh7p1*Dk@h*anFcy-L4m85fKS03VK~oK@dSBxZwt< zctyC*_dC^HJw20&_rCx4{l4e_KBOim-F42X_0&1Fb#)VpoR6urHG)Pca%%Vnj1T1S zivx51vu;geM! zpvd_)sI;DfMksP>_}?(!lf$1bR?1H(a=ue4?SP;WikupLt!iU73LZj{^Q}^8YXpr@ zVoEpA|%ClJT5Q?0yqe?3lG(wS6!@sTC zh-AS-D005tDy^rW5sI7|{u{N9PZtUO7xmw)(hdk3p@PECR&C@)!9yr=z5H>fr~S?~~wobO4M)>F_3MNSRBPqlHU3zhN{ zikxq+N;@EEgd(SgZ&q#WM!`cUa=t?)->S?~~woNvBL>nUi2BBzG$t+uh# z)0OfQikz>jN;@EEgd(SgPg2XcQScCooG(tLtr0XrkyFFFR2#ck@DPfeuTrHI3mT!w zso^D+Ct2_iikz>vO6w_Tgd(SgU#r&f>1j&&2}RDgN~IkTG(wS6!#}C&$VS0KD003= zm9|FE2t`f}U$6F2iv%Cb9zv1xMXR(mf<`EEYWR+-jan>t2u03kP-(@2 zMksP>_{r)RD_QUmikvS?rS%jvLXlI$pThdIqW@PYGU*5VZT3m!s|^Bq!YJq3+W z8VQj2}RClP-zDQjZoy&@CK~MDDqc%fFkERkA-lVwnoqhMNSPLt=fpi zf`?G#d`zVk3mT!wso~eEI-V?e2u04fN~QG_G(wS6!>6lte0qvfenOG+C8@Lnf<`EE zYWUsi9DAeSArv{^4wbe>&#Qp!&#a=yJP?SP;W zikuq0RBa<01rMRf`R1y$HG)Pca%y;&D&xh1hfw5vl`5@R&_-(3R6nh^ zpGbRH^}Eo3PON`K_0xL#iJMJTJf<`EEqAqBEVa|*DP{402-=6iqxSQ^-rn_x)HxqZh4YW#>Dg35E zj_B4=g!Iu)k&LetctYJe>Pi0pas0;@Z5zhZdcLkI=0#fQKhX~lRcMocdrxHCmdR|@ zrb$Y!UfUBHJ$E@P{b3S&k#0`tKl+0A~+z9Xj$^qnD>!R5;fa!n3?00ZF1#%T5_ z;0?eIz;l4d0QUf{N4$3fhCC3>dH@*UHG<%mz#b zqyYK@Is*PcI==wcBL2g;z6;m|cplIQSOvHlP!F&Ht^pJPCIC_ZLjWBC=MnxJz#+h1 zz&60sfGhyHIMhpTsvEdG;tg(5FStpSOwSxI0caQAv~Y~umR8v==wgw16+Vcz&-%`0O0{y z02iPUun)jK1RhWd*Z^Sr5hoxEPzq=OGy--3ngI+CtxAAGKqIV`7Gh_ ze717HM7Cx0M0V9h0eZ~?6WOPrX)@5@k!^$w;ieLf8s#%ijP0IZ$!b?_Al3OT-q*S+t+{T*R;yq z^@V;vNgEbUUi{+EpJwm8@w)woFZu3^qxP9w_W!cyrVnqJv(|Ret|u3nmz*v8*Y|H) zZksV**W+Vbl*u%{%kO78Mc=Vka%5c7)mrdHcIg54;)=)K{~}`Cr2U2~{&iEQ4;F2S zdE)mcw~Vr_eLm--H(&ZB>+FtakJ}EVRL%b^|GiEh9l2`!`_DX^^zqQK?9-VIGY{^) z*toB0%P*S;4&J?K&i!k)zt`o7m$yB#O&=G%BC_Q9k2}6GrlZ(Wsrq&jNxC%PTd2Wy9SJ#g~Yn>H>Uuw`r16JInvn!116H;=v9u6E>E*5%G8 z+uz%JZRgKl>a=iK!gzc1eKzx7bn{JL{W5dWqB5hc@1Z2iP19M~Pd}`QvR(Ux?$TF& ziN5~I-CfSS@$m*r;fWWzf4gnx?e!~OJpWn0qh(VP4)^@I{==1)g8k>_8lRu`?#wM? zy==$2V@WUV&wk>wsR!2_8gJkI{^RF<`RK!iC#<>WKX#0qxT4~3`?i%H_9PhczU&u~ zT2c`6^qcjaj*eR#S@?9e{<5xJJM6q!>iA~tmdYzP-Q<+o?=OGx(Jzeec0T**HEZAe zc-Ww|`!;NT^5C9c<2PNkywm2yjQKCW@HgA`UD6HPe%QLH>4A>NwnjYg!A9?xNe90D zd(8(A_Z<3(;f9Nkc)E8m9ltTde9wf1_D)aETezgdd!4^{*x!EjWzVsgjgPduE^l?0 zQy;90zNPXfUH?B`jj}Gdvh1J#sIW9FPP6s-I%<)l`qKS>G>`c3)_F?~cYS;6(F*5h zFP=Sna_617J74H^;LZ)D->m!Sqou3g_w9c5Q2MN&KAUm6;-&X1uH3QyXw;U>E7G2y ze0W5sLj{+{{QcLd5ox7M4B4-pEd8wbvx+BA-swoL+i9J+a+C2Nm)uakqwxc0Y}&EP zS!-%Kz8x{C!%Ht-tRHmw(8%JQ8QWiv>+tgPchB2A!mx1D{J;7SzMA~rzAd*u@^O5> z=RUo9!>i^8hyG;x{-JdXt72B$^-o2$e<(Ap^LIB@v~yo{C5ya%YSWq?OST<*Zp6lG z(=XlH@xePkxVzKN17E&y@<{!_&pzp}|AP;2&N;UK^lzJvRyuAtJm8&+cP_tr=!?I8 zUbDejGwFriU(JhN;ab?m|5ip+`TP#LZvICscUhk+`|U&jB4hr0wu@_z#Weo-L8pVW zZ!k=MbyLI`E)Midv*I;Nvk&%tzWl!NMzc+?W>~>zBBB~PiHq(d^|XDN%^L2 zQ;oazmsT#gXM}V3=$#!l`|j-c+NGaG&b#BJK0#7lna5%ANC^p2wZ-j$ZIF@@laj|I zCXMM7qw+}ERo+Ucd#qGeS5>9O7rLDbEhev2W~neb#!53xUT2xbEhUfiR>n&yNl7C+ z#n3O;>F~O(WmR6M+cTDjH#(elt0i74vl-nL74cHuv^goGtp&!KWBH2ULT8=J2)y0m zsGv{qPb7j+$Yif;wp6=`j8tH% z@5KOAD{}&)r~s4$C_!Y2nE+(~%9qPnVJT6B#P1;}i^I$+opzo- zv&F`&4i76sE`_{ZRLO9n@=@OH=}MJLSE^XLQl-+BDwM8NnRKO! z^jd9ZO5A0v^3c^|ayxCd65d{1ZZwnVD6XnQ2IT9~N!sSS` z90`^qv2r9-jzlaT6VkC!H8EKqV$F%NqL9i2a7sf~d6WjN`jt9U{nWr!cPg9TX5Ez~ zqwpE8s>v+rL>6nv&0<-@v-myv38Z?7?NI22BeIz5TR?3VE3$YCjCB^b#eAjJf%LMy z@**28gB2I$&q_^6%qu96Q!rFdW=+HMSz%5VJC%)iaV-V70L_2~z%IZkx^XKx%L`RiaN?YIx3IkaaK9ZlG);^bC^gNv(S-ZvqX(k$!opETtV3q zbT$5IMn{#=Cb{KcavvvotV@VF-(f^CCE6OPF}ed{LUEXg*NFWWiZ|EkrbFVC=sSLD}Iku<<^QSHzX$0AZ8beSMHWCB%<0KoA`R zj+{v&1K~jr@^gA>2wmgn^pp^~#?R@=A#{x&^uoeo$wnQ$WRayTnks5mk-M|J9LNNW zDibg|vPc%FjmZn)EA+{E)3PCV?80HBgop~AZm*Pr@LYCN`M_UFu2*hQC!xH_;ML$< z6y9U8ArYtroy$&ZJ5v$;I5ww7v?Q>rm~D$$=fQ4%?B7{buX zpgd2ZIin5z3uQ7kmSLm00`=>G6)fJV<@34-*V zreO$6de1v!#hlRaAYgwLD`Kp*dQbuncIk}{RgefDrXj0+l-cT`jts3-wOuCO#yxdV z5W8Gn(DIN6nlMwVC*Ewc88~zfR+nOtDBot@f6F$|Ozj-aTgFou4L^ge^3tp|oI-Vq zfqoZxoiImCnpFj>6X;W^uddf*dYrh&%lSk<#(7{LVVTiI)>k8!u)_5iPnn$#TOE_8 zS?o?oOqz|kK2}OZII%{u3O23r8O$-VFwV)rI1^VFuKNyU!TzcBq=ZJfOqzXWlu0PJP4-mx+vt-RN1Q+uSkjJ3w1?w9 zQ+*}A{v3&?vitwTgg^T6#okAJ7Yy#aR>w6vA&gPcs zOZ&1|vCE7RE_4U&K~g;VwY+OrTBNLBqJ1VM@qQNrjj_s;L3u{6aV$&X4t<2v>%>ri z<;}{TRzGXTwE7~tDJsmR%N+WLkyU-}B;2WOJVZBCov4O|ak{Twz1!mXGcw)M0zX6c0d~t*|?* zd0JvjF2ZaRhg~*W)jZMrco;`cUbjT%d%4~{LtuWlHCIXIb;;pnu)qJR9qKC9RRW52yAX;j@7@K?015#(1oRl)M zmi{HiOm@~_WPmB2w-Vh2it0kuq7OH^XgoyrF%V0vxi;3EK!YsINR=29V_MEpMJ~r+ zvQ=&6YtXGsG*k1&NHlWbQ&}p1UTWUlB4f3sNS@u!c22}_8iQ1Gs=0PdqM0uY^7|63 z3(8&!#x|hcH5Xt!ISp$km^(KDc1ajF&cs?sA#63EacUN0SAaen`Zx|n(t5YJw!*bC^(5R%LMSQu} zQ|UzbX;!S@B7B~OCf|se;?jg>9%8{t?VAu zJ9xF>c|qu3)@NBm<-rCka#_$wht9H8DDxu9$FwRepcL^{fEiU@jOKwWszlrq3yX+8 z29OTG`t(q&PY=cV^w5!jQ~(rpC`MmHlcYGzeRw}GbRs%ci)WG51-zJAAfEi8wR})C zlvk~kTW7+I5DHD>C*%m#EPM!8?4ai=rCdza+*Wzv0rd<_(QGM?mK#(GtS|TlO+~9X zEGAfuHkBv9Fq8xjJf9EB(>Y}fsdzw}rQ8-M*KFmQqg>}I*Q=B(pED}=G;dUH8O<6UJI5KQB1XeE4z zY7rAK8E2*Gnmj5-95T*gM<*_pB@~>STBBQoR`7g!B+q5k@Z7Yjta6;HSJidi=hO#! zA(aYVV*Y$)m38*v{Fusx(%*Uau{`lDavOirNjOV`n(qD2NaS-fn*ql z>`K~3uJpoI@$jH?Qy}q_6B8kcTs$&tl8TI&TTUZ=nPYLAjSkoWXO$a^RMK=yjT~R1 zsT@m;tlX1WX7pG}Tt+W#bFo5P;lXtzqUtK4N+5lp;XPDCw73Hn^5nP1DN+E@-n#gtj7 z{8&&9EfcRK=5gB@Ei)(b<_sL#dLmyhD1q^Ev0~I6rqWnhFp;4|M6>54c)WG6Sn{d@ z=fWOeXdE7S5dx+?uuwty;dtDjiM0rW`HEP?Xc11OwG!6K)4|-8Cx;6#37_0b9LpE{r8v}9`ja3$Or_awEV1yVTJ8F)x+v?hyIRW&ChFnyLSe$^rPUzJh5T1yoS!HU*0C!t zZ{48Mu}~%-1H;~j+li?Q>O-2GTQDQ{3Q16@{*}E3v?rRPivUY^(TCjS{Pny|u~5KB%Xl@sfp}BH#~ZvI zp~TC1TgI#54a7S#e7u@%5iAWT@p9gl@oIQQyjU{|7jNkH3y)Xf4UIR5HzeMa5LpEA z!X#+pP5m?8RPf5nkBNK$2CuT7uWq*m%^?+DZU>21p0fNYFCQ!tue>(;r@U@?PGKp* z_8ng+RVEqGCqC(bf{=lh;>f-YlP;G=aUU!fjGB@+&RK$|t!N@c>54gx9ECEb)Y!rn z;gm2+no59>_#J#6g*_%doeGMY(hQ2TT<$0NR4jzE1)q{<;-z_52s_r6us@lo>N7?;E*G&VX3?X;n=Q%H-^>f;3&EN|>d_y+FB=6yt$a}cd zpIMz5>VZAE^HB}HCj(Xw*0Mx&1Xw}IQ11Eevhc`T(Sdkitx@U{bw?X~Vk;c=h;45z zLJ6!48ssjPC1oUMBxR&z&@dx|FV-plM~xYkF>++O;!6S(nUD}!(LN34>*}^|NPS{_ z71#?CVKEvlp;c%+0|jZ#;fql;#>P`>UaYuF=qHN!T$o1QB0bTwm8jcDlo`0fz`m2( z{qYqezSk5p$7rMB6ZW?(Zd$g(S_&ng#)3yLoOUURS_HP95TD!@u|}bE#VRLgQ^cNE zn3O0l+@K_4NQMUq9i}>UP9YDtXx)q+nLv^X15IA#Ff_8J5W*Izyb6Ivh<2;ZhV@3& zso9elQ$(|Q3?Drbtxw>Y#0n`S8CtEg&@!kQN`Qwj@faEv(}-Ri{W5jKi80wS3ssQA zV#0lmj|nPb=$E(NV|$sjkRTP z(bwZ>DaHUbC=~KQ&#rhZF>(pehFwmG5BrhG5h{rr-$dH3f`W+cDynd}?BGo-b(({D zrwyx7^5cD;m~45!9c9D*HPJOXz4W2f?^;IK1!i1 zDlk#|lEAqCF%xwX&g1l!3&U>3BkSti(0mgW9Jx!Q><=HC8WB zZ)1}9q&sxmmbQAS!4e)aSj6X6HXG@t-0tKGN>1cD0sDhCZZ+e|mk0lR-NifcC#Ih)xsyx~v)B;$w_bqm1NVHyXoWaN~}Ued|y9+B5#JQ7Xc(yV}_z60W7b`45?NV zp{&EH8Pbv#$dnAp(*l{C0gVg9CI+HcDLbo=$H5>4jKw?gBW+itlABRAYi4Mu6Si!>;;(JpL(M5DE~ zK%&uBwLqfLI$I#oXl*T!Xtd%$L<<_4tvEQ*f;NirRcdSvVNKG3;jE>E9?QTY#`G#X zy}Sa(pCeG^GzvlgN@i6Aq7gp@Lc6nL7?;SG087Au0X=YhJBRAzS#ikAlAfmpgMbX5#u^l&VX7t<8T0b_qGg(6;gzJiA?X=Rl1V>e=y zfc*sJsXLjS&PK@l&GmerTU5_$?4b3Yp5aelrmCZ{itt!cJI*)ZB% zmBtbqc4}#Z2QHfsux~&}aZVic!IM|RsOsc!Rm!4_99-%A#jvH!;;liQNNFRbxRg<` zSi>=5L>n)S#y!?c9XLmV$%z+>*yuY`Mvao<_+wi#8}G&BJhZ*PsO|klZSOC-FyCK9 z7NAZ4+w{Lp|1V7aPpZXvQ0!6T-~+3};EfK=%B!AcmQ;(UAk%B*YnpN$sa$b*0Ca@L z+L#;r!7U##WRsWT8PS#5OadeURsk9T;}Hhio^*z4yfi4*Gl*Vo2LE6@^R8_F%lKg& zE%U{CI9Cu)tcP<9mWYT56xU|Y+U!}IJ-aaN*>2dJ=C#@E6rl0`Y?ikSeq8B3aiN_b zw@F+=Px|4xoQfsfVzk+dHha-#FD^`bVZwrUqPa{yM~(eCqnS2i0^v# zCd`t^AehTXj!qhrJSwfslx|E(Q8!IK3_+sq|J`B*^xFoa$(w$ zSTo+SfsOiD^CIQSFKjMsO43_c>ji|`l%%u30pAFFLN=xAJJ~D?!2X%da*A>jlCwuo zOThaD)%&Dm<$lz(1l$)*o&%<-snZft=n+tjA1@{h_J`0BSfytpe5!^{{*(~9Hh!Wb zQ=0HOLFs3w<|HK3qwPw5xSt-2*ZPCv&!NJ=4VNb2(MdPX;^7$;JhsT6ZNnpU4t$=2 z=B4}`DW8){<^1(wJdE_Y<2K4@D$AJdRu^9uuYKQJro&EQdGB&}5a~g+yt@OL)&g4n&5VyrRN{ z6y-|(+**8>1Uy9vd3oe7N|-e}7gx$x1wEuG$+6L^vgrAHuo4Z=9~a@FYncW=4iReo zg}FI$_3)ewm!{)<3P<1}5lq{89J#Y{Q&R{D9=^SScq!a}E(6L7xwihVt^aH5|1Qk_ zZ_e1*RI@aBZ0txg!<;+lN46nbv8;2I>s89NNV(>TYYyF{)Jh2BDKkk!;7hBGua&Nr z@91mKR)>rqNq8wh5&WU}g&wyQN5P3OEWlrDl8qs^h=G61Wus_YI5j_rrVdm!M|5T} zjN|;ADW!HnaEL$|QsgpdVhfZz9L;4h@;X5WM=p>D)DdNoi=J{e`26vWBAt!o_<+)5EcI>Ceh0WR7;NX$^G7 zxVF`BDlJT%nCz~wI)}3^imZZlPVl$TImE-OW@POGZO%O2@G^8&hL?pV{ve$**~04_ z@eA37wr5d>aC#-u2}g5TtU|Y1=nsVxG6>Z>4eiguk+ufOt_(+*!|IDFn_zxXu28)b zWom(U)rF0}25)Kz#}LBZBp8;>m3!ig<}*($c|Grx+TgOPJcu>!_t(phNUU> zNhUKiJ@=pJ9i=B^-cs-C{zUH-S{S{vnPs~k+Sl34!bS$S62Tv;cQ&(-ZLpqt>%z;> z>j{t7#2?f;O}6S5f&+pPzmQ#UPVsF3r3|QNS@0UUigd#1ohVCqno*TOsNPYWt@U?W zT4+AYOrEfMA@Yd##0Kf9C|9U{3I3LNA)DaV=CYNAty8bDb=kD0ca(N(dgsM)u`n)3 zcELH*%1#LxR(9cNa#_Raov5F1dPjBIdf60OEBe!#PEtE+JV_V6@S?^=#Qk(btVlF}2j;F94zP9`z#2(CMk$55RVl&+lt+p|h7N*^ranv%5Fd4P!KipVQ&3{b6-V@Q3QuLeU2kK{KcGBK|NAbGq>Ltcjl()SC2Q%ooNn z;umrWZL6XT;dDc!6OJbALpU0R6Lu}MpVQD$)|&O=-8*&*3cuVbh^7LUx=%l{VgYsG<&s!mmRd0D+8GOQ&>^Yp?amEwa_aq zEi|uX)#3XpkSW?Yqv!ZZtv$szwRn!wB6nqE=bt?Cs{W`=P* zJ|RC&*XV#KV>sOr}L^;FJL|Mbp0^wTf)Iv}AzJbCBd57v0t-FVln^PGZhU%12 zNh4Hu1b-;r>n;l$zZdiPFplpVgu`p%57H@8Ss#Bs|p*kY?L-Afuc-gor!;d8>{%|@)@wcW^DosgT z$d=ajU6tW=ioyul1(zJ>_LTP5nhdBdhogzIhNFr4fy`U1F`BTS@n>ZdG7r_OGQ91l zwQ#(vk{HY6P8x?VZ1C4v;iV2v{s|7etD4-CcrHae_ZIrCg8wgmdS`ss;W<3+w&wua zo&#um4&cIk4&WEql~q%6SYdGvOPZI%x=zSpE`S6`0%QRS0i^`fa##aFP7Z4X>>8cJ zHoz}s!;Z`XFTe%-DO|6{M}!tgCcGuuVX=*k#pe$B3(@H#aX2SpKKw)HVY4_Y@To;*tP&SHO8y>>F=0X(8MLy5 z2}W+%lz(mZt*-(adg)B<+rR8PcX^-he%W_^=`Z^_ zd~xO`>%)D_Fs1Ya&*DIPX;iy%g>*K!a$Kf2Zbwt4hq+z z!m&w;fx1dOD@Eo8Ur=<>)m-LSB1v_8F$=GpV0c?4hOc$;WSHog6x^#gvSX>WBlx>0 zWIh?g1E^Nam-~q8@A(3snTZH^j?|*It?kFX}~P;1T!1X^Qe9?`0mfTtZ-YMYD>dd@E%g zN%yFSYPy<@Gy^g+6FmT;)YXVUHq~@VVDkEqkhzd}ypUy$2p?Z(RKh7db@3V*$vDEu zWeP}}8kUTcOF2SrYQeZ#-uyH;lD3S4ywlV?$Wc%^RUDO9sRRD3I4`m?npfJdj_sG1(8<%XCOSo*GPmhgK6%_gGVvq}ur4I0KRo)B_|BPf+-v zIzpQ8L-uMJHL_Q6R5qpD{F!*ORpbe}1~ntP*+^4Gk(S3r`IL2>-Xlr6PGyoc3;BVp z>(s_a&yqq;r_t|GYB~XVt2io`Qto8B zr)MpMY{)OyE7gG9eq@&{VC-ZaH!9bF z%so|QK{BU3BdyG3zfxXNK%_6@gJmvoa=B!i9)jcbs>Nw!J~E8VRa~IVWB5LPOL@1< zqbzrqQV#*S%XJ~=lHv{cWw~Q7p@rP#JS%C)7qt#VwTN&3lDS?gEiu9jCL zcNG_?gLH;IfcIH$ix<)twny&MDK1&|yczKQNU{O6FDdGndUVWXf@Cl2M?l|YzfxvV zNHwis*~`4a`W}Mgve)7?vQHKH66J<{S8;)Ik7l&rtd%{=uZ(9jvVl6gsyvl6jtP`m z*71N}mNnL#xvU4uLgAfyP`Tx3729D{ZHFj_R@N#GvKIGpv_d|rX(b(3%O}bVnX0%z znbWARd@-sHY5mC;_EkSpQoIUucHJGK?|D9c`3exdh)`k=VDiN{!8 ztM@^5pj4G8gQybW*UDbSk&Wl|D(XhmbCBMvWfggbj8z=vO)h^5=>wO&toJ;{kr))y zP%KFPR6@BAtL6I+B!Aj}5b`GZgB~P*uJ)R-o$PNZe;FSve}N-zWQdRLLU3IETAW7y zNg`jO{3xf23zR>Zm0@2=D{t&oFfS@g-~zht(v(-0x3>Hgr;xXtXIa zzN|)Hp$OfRX6mv zfL7w8hxo>h+gyY9+e=tHpl>C4s%+kYbVgj}HM#L+Mhr+K@Hp_=wz1NXq@;3u;bwMz z(d=Q8{GCeqgJ*ctzL$m~{8M9Aiy5&nwi5Z{**VyD;q;V_jGe)|>TbaV&|AV}-1g)v`vmi=ARwx&~ddu0hWtc15sA7S+%W zufOi72`~<<|HkQ9xSyVBe-TXl3{3nYks$q|lwUhWzi9qz&*&G!e;pY8I^x#}zs~q| z;lHk|E9-_|cXkneJ@D&^-^HvKe!cPQ!!BW$;@6k;!>>OZz$E+zvO#Px8-iaf8_F(2 zoeX2c*$5VochM!X%TYtgEQO`Ak!%!8W20F*-cy%>S{u(Muq=kR!LVGG&nB`-Yzmvo z3fMF@9W^?W6|vcD4!e?F#pbd3>>5_Wuwu&0tejP{g=`VCGbdZjJgkaUqe_>sdbX4` zu}GZ=yPe&^?qYvotJ%G5Eqj1H#2#fnwvMf5PqJs&-`L;T^K3JFfo*3ySQC4N z?Phz}o9u1&9{YgpX9w9~c9b=<#LDyN=P1i%$ zTX(6hziyB&RyRx+uS?RU>PG9v>L%#2b@{r7LiUpnFNzq8P;rh$#x-}=x@~Ds=rgeTEABRu>LXqdi^u{4f-wm?fNGDZvC73cl96Y z59yESKi7Yy|4x5Oe@6ei-mf=Aw2$Z5%)$s81ZPt;}K6q{4L`7h!-MWf>yj9 z@n*!k5g$Yxj5rd}9PwquiHIK}ev0@t;#`D3BEk@D=xFF_=xOL<=w}#ch&2p1BpOl- zX@;?e35FcQM8j0Wbi*t|vEeGi0)x?DF;p6C2A9EOs4*-tEHx}Q++VJC7a1KH z6WJlMV`Qhu&XHXryGC}yuY2T0kv;J18F?{&z4)(pr1=SvYmGMyXrd%dnkFm%W zT(@Bi@)E`#J1`!38DkI7$hD0-+QuDiCG&0PHO6 z1)vb%0&IZIAUo37J&$ep8PCO^0Ugi)USU@nJLhR;IEh(p4ES%5#ayw^}m{q$iK)|uwUd~Tm=`ys?dMU1;@)+Id@+v^(f*Gy@p9At06b~ z2J{iI`&oD8v7|@ymbRtP>CejD7k6a{ zO|f`z?*ZP#uL4uetXO@rfOkIDpsYyC%VRD<7%%uuSfMh3>IOCucP{)?*Es3(!<7H5 z&zEebE6Sy`=VoWtbCW(_(&M?4nZxGa_3D|pQ=m79fqBE_mzp!rKXv+pX=N@7*LeT^ zyk2mfk_A6ovh_Q{)3u4Nj5W*GXjhhzH<$*{WjOroaL#)%=WA#xSpPIm%*iyme?Z1_ z9+_8!Wev8kKO}s^!X3?YZQeKNA9QWZy?sBw-hco5{Oag_oL?`w{AId=kB7_Jy!ROS z;Yzb^?3xoj@Ww{?cM(p(Gqx6O$2BI8HLTH&AAZUF0{C6PQJYd+*4;x+H_7+=D1777 z!w)ni-8h*^7t4J0xKFxIzAtuos$4Fo+lzNuy5%;`PsHc;{qERTnLF-X)n!TAKQhfmuaP1sH=5`()~wv_mFRk9 z_MCjW&YCiDB3+GDW~-B)YBeX;82QuCZR9y^clbm_g4XBXm*NV2sp7N9o$P)5k>XJG9q#jL~=M5Yf3~M3+tx zT{}l~>tg8M)o@X_$R6DzdtMZEagV58J=^uZxLxmF>=K>sQoX*fA);Tjp?}B70bQe{ z?jW%qH(_kGIgd31$hFyKN4-0rk;_=&0!E=$Pn^(Ve5o{tSs=Y;qLd!P}m(yE-!Vd>6(JbZ6|>o{aVC!`SG) zjLjKLfr_+aX3oU)6=N!niNj1A3TEETiZ3E7NIf@zyJiLt_| zfN8id1g;3QIgBM=#n_J7Q++Wh_WMxDd~`+ZmgJ$$B4r(B{i3#{PzR zq3c>a-@KHuuNxS9=my5FxS6ptE3g)IJ7Z(+WbDILj8(2ie%COzY%QwfL0lh(|53&& z9%Jl-#~DleD`WRO#n^YxFqZKgV>fMJZ13}o8MfeCjV~blizxd`j6L@-)7 zZ0DzpO>AcD_0Jg_cN}&01)fy;im^psGuHGCW9`31Ilg1;hVN0|KOnsyQKpl?pT^S7 zPmJ~WnXwMPU<&~7=^4hh|H|0y|HOBDeq*frS>zGm`5k=c7<(3waUSsk#{P@3X8;$W zski{U0iFH$HW1)Oz(&A_fbRk40OUS7?`JQZ^|RH#`kCuzKbv;S&xZftM;`s`o3H$A z?{PnSs@cz09`!TlVLvNA=w})G{cOnle%AS2Kl}YH@a^%lk9Ygo+pqZ9D?9yc+e?1- z{5C)P`xe0Sxc@tF&w}=ppS`=@&yKG1v(t@!7X65y4Svwia@P8pd5xdlez%`(z01$O zTIpw(+~#MqZt=6bkn#7I`&sX0erBrov(0sW7E|MA7O$VZvDnYzoql$o4f$Q@XAKp8 z_AfK8W$>5!+1dqumTv3@o%-Om!!{48&zpOvQg*-c3(PokfF9gjK~;b#knq5dxO zvra>i#t=XIV340>5A?Ga2l(08{(kmaU)0&9es-#lpWV~j&$4>?p<5_N4?nBF2=(0^ z>2*Vyx&jYjec#E?zU$~`zjW}kNWj1tKg)0LXWnQ(d$ygQ{Sbvb0`7uK-xTkq>H>Cks|zdi#Vl?D%5KR7P-$)Q8z)(smlVr_i4#9J;um*hzK zGE~vo&a}>Y zu;{JXXNvn>nKRdX)%EipzIyZgJqr$AbG+pH($mJD%1)ZTF(0+OSN?Lv`pT77`@*S< zhS<*9-m>58C~*#U9dkXhxY*s!v&B>5HB>!Om0kUDwXNp&nj34|*WFeZx#YSfCzmX^ z_VsIr)!$lwynf7ew_W$qb^Vr>EPZ(Cfu-%2r7tU6cFVHAE_-#^p=BqQ{krU5u&@8Z z^#uH{0)GqW>C4(LI{^NYrTvzEgz#goJC3-9)xUo2f@@DA{>UY_)wQp?vG(^GTg}JS z+0{=}8LCRWTRiPN#qLKIA9D?Ml{oKpyk$RY8)BQf$i8r;b$#W_74MZFwR~efY5J+` zwDJ4W<0S{L*|T8t{D-f;exCWNoVoq3JX8GE><5divr=cCo6$6V`LxV}b5l1@u}7D!~d9k_gW_z-FWo{ckXWUO?SB@EyzCCT)s83TJDd&=Ixx8EA+V}w@)(smP_vFyH z*!6=44|-JUGhlVU4t=k`Y z&O37G@Z66NA6)R!=ld%^Jo$dzzR36PerM3zo8FrE=8-+#H#)!m^lOt}J+bSKrj(tZ z?6~=*)a_qvyYGd9t&v+^*|hBW?2VBd-g)l6zgeD5d#1zF$DiE!*N4_GeZus3!MZVz z4fFMD?D1%qM>;>;?V;We4t^l{{@k_m?(^Qedd=2*j;wCCI_>U-fAOt4dRPCu%IzKQzp6jcx zAAbGu<-X;nK85YrIRpaaC(>ZixTfP1QI5^XB?nqE_6q;<8(tZoT@p^SAkKzhdRtmCxK! zc4z;)j^5>4weT-#ceh)8WcAj2R8(L;-~CSHdv*IxzF+y_=ld6Ybok)hj}IN5cjV|% z<7Zzt+mD?&zVyrJuUCK5|J!H2OaEcdkHx3HJYDs3e;*o+Z=!WRbsZ-J)&XqHW#c z!d$o5oc==k_Vk_UyV7^3?@50v{oV9^>HE_UrXNl}n%jcj((^z~Dh~u|wkqjOdnlF6q_sZ8-+7}MN9H7K`%vJ2(;xS;{Z^M}Xwz}&u+8>6I{%siL zKa3H68AkDkFrxPZ4&lBGqxpw1lD`e3_+j-6uDuSU_Zw?%HQCjMsx26?AH!(A`C@&%b_N&fGJ_4;H1)Y?_`~uz5<~NlWtH&F+;sXWYs$+tWTx zJ(tuialnY7adEMO2lW}yq3>_KkM-Q!{h2PecU;(hQWUMI96A5u*?WJj`nmX2`ValT zjsE(~@vobY9zAsU@WIdbpL{>^y+LnJeAD~J)32S_m9q2Zm%i9mu=SNq*&E+^&hl)B zr+5B!=@SL(hWUCt+WFz$4<_F~@4nS*j$jPzTh;%rXYROS<#~*I@4=Y2`sN!j+C7Mo zZZ$@^CX8?&!6-HkBU&9G4)>2>G;6|0wi=_@gEy?Z@dk`u>u#izVlr6##c5KZ2e-}%`c_wJhAKP z*Sv2`d~?v-k?);+|MUHa4<0&v^yt^kXO2gI-T&M4ABs;^{e17QFP=Sum52zeQnlyD zt-9mnQXiaD8i3PDu`CYfkuJw6q)|A1l!0?c**I}DnO%XI=}eq5x)M)}T*L4#B36Nu zMRuGj^0FG7D7ua{up8Jd>^7VwTE$Ni-OnCojrYvKRRYqF34L>iMAq z>=65eea4QlFWEQjJN6@H!{JX4_0nCU>!%y28=|{RH(ZyXo*x>o%hKiQChDf>rtuR* zb97hf=Hm>J31^6`I-AakQ$$s|T3x+vneKX=BU+)mU3aJMZk!}qt9uY-*q@(E$A*eXKrCACFT;Df&@3XOy9zpwH3g>nG!^(RBSxoHm-P zzZ&O_jCwOp94*v4aOTLXuhB2jU&qfK-J-uue}{e*&K}*Xe*mYC8ujaN{^%+Fvp9jY zNxxP9qJ9TXA-$@91Lu(5*1xC!Kz{&dkv`FXraz|tQvVIkBmJm9jT1?~>Cfr^(CZ=$ z5$z(dBNEXqqDMrph)ZxbX&~DFf8U|_Sfhx>NjM1)C^gW-P#T1P8ITf)(O}XuT?6;( zg!jLnJYx-C`myx7OusC8Y4_^})F)k=zhpsOZS8$E+p9mTYFCx&HF{RN_bmRymF}u? zZg%`?A8TK3du!3fi_8l*TiaQ$u6(|tLq&P{Zp&cHjpnaS1*T19eamh({#068y00X= zWXm+1}Za zv)2}lC~BHjJnQ?JH_Yrib8BH?;rBCcoiTLA>(kBCBd4#QHhJ3j1*-~17974}`4w?j z?3-FQb@0@8rqoS|o$~(VWs?&oADOgr(zr=KOnh|W%!!7H+wyJs1M?5&-I14 zu03~XZgb89ImJ2Ma^A_lHG5*VA^X*=*=7f1dkt{vDHMPU&#PO9jU1{u%eo z98~nw?6^6PUD@NR%Ls_`&zHxsYw`|;;aS7uL z<37oFKI7Jm(u~m=oin~1yJPI?vDUF!V|$JLam?#u9vb5wGi8i4=GXLh(jQM>l0Gy2 zvh+Vj?;rj2=;foY9Gx)QF#2%XhP0d0=BK5kwNLwO)aFsQjVc|LHmc*O&quy6@{W;Z zBhyEA8hJc*Tk0LDrquM*PN~OIUPxJ)VoXU(>5%eS^5*0f$qSN`lcSOkCq0*RL(-K= zBa-}=e{lKw%a>d}?ec+_|B|>j@xeq#Vs>JW#IF;!C)|-xnvjwZnQ$=vsrYN-r^OG5 zKRx2L5%-KJA2E7F`w@qSKQp|3c){>~!+#jIbJ(53t{Ij%?2ov2;~tK)$Bm2Y5O?^p zr!K3xY~p1-E;}}K!_cKe3x@U?`gQE)*yXX)VlRpPYRL0LmJXRZr00;&2R}QwdT{pO z4ud}$^ynb#pp-%92kstt$H3x&{RVz1{Y~;p8In%gGvJN^MFV;dINIOWzr6pj{y+5F z(9hj(RKH*QZtGjucTC^2mu|bX=F+rFf4OAiC5}smU-DHSU!VDXdiHs@_bt6Md!Om` zY%gQ4p1t0@xc=hAi$CjmXV39Hzw2>dkDMOgU$o|;aTguyeslM@?r(Oh=w|5lNY}Kk zZ+9u_aG!gC zF)kPyv*faO*$VTsJ#_3WJC7CX^SENGtj+!Zx(2BGZCf8`TOVj!AGk2r2io+%?VMTL zIWyDu7wU7>7n1={Tx<8edI%0YKcu+nCg*JOcd)71p!_1_g)#lr-wEB-x>Yh%ZJp83{fuf=O+uf5l%p}p7ULo0jj zy_V;H`@L57+WY@bx&Cjq13gKe8UvvD;(TTt(a+g<;Jt25d-CuSKs+a>x3By8&46FJ z-d#NI!+`&b5c=^D|Ctc~FCqS8A^y)p{LLZ$q=vetv6CO0_VoP=%s-^v$97%wRnLbq zKIr!1<*f9+`@X%JH)PGfTQ19IUH&FRDW2tCfisr5PIrE-)m!Lxnk*hXyJ+{AoNkLH z(QLCZlgHjn)gc@$j!KcM`w0J&h-1$9e74}VeEv=_!p8s-`A_DWhEt9vem>HJbB*O# z6_@ZvE-TJDR$;Z=2461L)koku3m7^DX~pWf1^xoul_4bFd(7(O$nZZ7@Aab7kskag zj0GWxF5&9Le>z=RhL|cirjo~Gb-NGjZCmEMttkY;@jK#2SN?@MR0+h2pZXc<@pP3gg9_%;*}vPR&TugiutYRJSd2 zs!a{z$DRh>GtX0@8kS2n7V(oKiO@+_;h)I!6!4F0QA(;qS(+ryw3FTd7> z_k4Qr4YWV!OiWB7HmYdaK-)Ld0otc)@T* z{;cWw1*!ZyCGIMR*NQAz-1Ihn#%34HC@PYD`~Y*&lL<}{imZ>2@bl|;HWE8ZmTu9NUi zbf?>GF?nrui7|yXi_wE>!V61ryp)H~#D1AaQqHtWUW?H#l_TSJC_m!Bt)1r}Q9gZ* zbEwE)YNwb4DLasjD#SglXi5PRKo-m0PCJsY;`OQ?kHubQtCP%CZoEoWav-W|$_BWs z4!md8XtOTi(Z|dteyhVw1-2lhR9001zf|X}!ne5tHIXPy@k(H|J3U^>W?f`K>{J2r zdt4=FIV5beQDUem%2R^LX?LNW;Oo1W<6Ydtr1C0#W{BdHQ z%{I+wb?~xNxl^dz)X*#rXH`X|L+VQ{yG0h>tl4sXd-2si zv|F5S|Ih1#(xJR1Q5w03iSidnz^u?y(urQ>FqR>kXgL86snTL}$+<;5DWm_Sj5StG zKrXjHxU^QodAvBW97r%E+$aj?f;vgnR=2kbFWyxJM3UqQP`;oOt<-&q(_ul+bvYUi zE|QmusOBqq4227n+v&2v2sj-cC+fj$skWLlyh2+HfM)V~PUiJfg%lMY ze1FM{SCqRg&_uL?MWOty*NYN}4t^uMon(<~nmSi{w`Fma#Y35)Rz6EHE)byC;wHWp?Y;|T})M;m@}A0Owave|HpV(D(YVk{RLRQ{?bce8+spD{tId`|D!;`Iyy#C7^9l;!WqFoh`b3*&BF1J6*CLB| zj?q@d??9qW6&NYC>%_r7ex4msed%yZTr zx~RXcZtAe!I&RxTf%&Z;E>KKw{KA9}vCqjt{C-`g>~@-R!I1 z)MR?3i#5zq;b?*PHfM zJ~t*~&*z+eH1>9t{;$WLDf*++J53+;Yajb_!55squwA7}PdR!1{<`bm%6undS@|Q4 zUvc`#qqi&RH)qbR8FJ6tsjp;a_v*Q*VaGR|{`u?ItMpq|e)Yg6&$F59e4U4tKlm-t zo0EPWqr~5wIsKtk%i^a#+_drKhSSfde^2y=jm_0+_^NsNma6ETO%v}(d2i9GA9(y< zUFlWBC;awob#mk5nTHeJn3MhJk39a3rMD>beVGR;uIfCX-?L2{=Ku4(`^xz9mQt^> zDwSS%`Bhykz6YCz#=gJqjzgTD_3L#jl=OE|d>VHu#E&te96qy^@J&kknXRPXq~yP; zmHam;<HMW-I#Fr08#EEBf1{5q_B4Q=#FBpY&g8U#CLT zCpziBN)O3D(MkVRdPwAJIwwmH3-O+b_{c|JCpz?VraF{a3?>=nsz{`mfOUh3X#<5B*o^ zA^J;n(tjoWUF6reQz3p;|AqYs4IgTMh)(uLq@NjLzlh$f$$w^u{o~;^A{>O35Y1cgqb*iq_3*F<{XZ%_ultg-&+4&>tAoPif8t-ckQmK zuI{Pss@}u!zbq0TJ_<5&*W}>rl-YC`8)~FyemWfU2$2Kd3%CvrAH)VdQAS%99|M)e zVX*Nx9}G+WbN`9(MOM5u_VJ-}^zm_1;l-jlqet zd#psLD`1Y-T$dB!xKz5vj+`$e=NB~l)7^2{H&;1iEO2-#?rk52T(IRN|#P~ zvyI)S>~m3)J%Ad!Zurx*@rT%tPfRsE9yWm5ylivC*plOH!NCtEua6I)f*kdZ+Z{}1 ztDDF>9(xOa-XUYZ){JX;?6HRJW2BYEDEZU3J-&NSXB%wt^pKn_My(lesH*O1FkClQ zc=>RO7 z6LD&5MbB{YNjun8I+rKghKN&At}69)-s$YIu6A!EPKi^K_&(!4PRL~2jX9$f@=2VM zPHW6glFwl$xlKL4UK8H>R7X%78nfA&>TU^UUIVExw;Y*STe8_t@pyG0m16rm<@&f> zw&6%$_Qjfk)G3(|RtD<`JHq{2LzJ2Xb?o@Ct?HgR?1z3<^S-)EP$>sT&p2&;n4Kc> zHA3-_1mzZ3eyZ-PFWYPOi^(nZ5>%02-_3))yV&y29kVxSNm4Z;4;2;FcCx=^Snqx1 zFG=NpX)GLnbqo7-j-J(r(~^|6d&|N^K@5BHYNhP6O_CH_ci_Go9!J>k?>#$jYAQvY z^y*|4H|%6P&3=0@VVxAE^L+cb?sH-6^u{9z+wV$Iw+#0zFbUer_W7_hX8B-giko$9 zPpr;P_7W|Niv!%GsY{C@f|CN0*mTbtx0MH^sSOjKWUL;U#y(TJDEnZ8G__0BpnAFH zVfHU2r)!5N4x-MA@4R3*^bmW-vaaS;af7I5Z``FT`XbpSg%0VXpAMof4L)adHaLR4 zZ%*=?y(0!wrx!{UZ>vpWI~311Z1NjS`H#p5)L-ex4oLr5&AK|6x|CfrSt@h~J7$x_ zOaloS>bQjYvE(C>>n|J*PB`FX?d_bcf8 zoYn7n#eeP>nde2q`&}BgPyg}m@Au0{-+#RPd;1~%f9@CmbH7N&f&C%oO z7|Jmq*cW|5bNmSV&(&B8cf~@xB0szd+fR7E&gGN)_yh*I)(r9`2>%p6zot0b3C?Gb z8qFa81AhKZanCZyUro@G;9v$hmH0V2#Xm|gj6p77kdkGP^X4nS#XG|wcOAjm402dR zZpP2;DegT6sceEl4Du}rDl^Fa_8I%--)4}T%^(#C% z3tr9WKEQ_01=kvDecT0JE6($g1vXI5*zGm)5GbEqR;n+@$xcr~851gsY+8U7q<1mzAVf8Q(c zUBDAtnv;;cbRuuWbr9D(;Cq6Hra8soS6sh;6D-j7wQ9Hu_s^}a3lA>Wv3C%C^mzZN<^1gmFWa4B6f z9r{1L!fop#AopWl@kSLBbE+2pHsg!Oz;`?ScA}{v%zsv4g3MF!y?*lro{|HU%ga0M zpMkLkhi=cmjOu5Q`Y7=^XdW(8+@@y@^Y40R&3ge%U6<>2Ub2PqWT~>~A|Sd@UQ*Cx zW=^GF)Os#o3_jej8KRO5+qd!E>OrTA!IAZ1gXDGtbLxCadhYZRu(a%RL)2cVciwSk z{_7H8aXVF`&7>2KqcRH?gq4D~t?#Ugm0^3GcehR&SO$W+yBrSfoncND4L?-2rwrsi z6^$@`hT3ar{bGZcz`J{t@939c(Yi0@OQP(d9Fe)+r5xP#o2ssx3XiAU z&kUXVaxf)*y{x8_F|1#4TxD1VcpY47d@fbXoC+Pgax+y4R=s+hc1>Ivwny%Qsaq>S zO_<^QzTGTX-hczeqh0~O`-1ltH{tP+D>$_{?-eM&=qbHtBa)xEmrSezF zI%gO>9^4Dsk|K3rL5W1_qa(0=8)m+F%Bcf|CF@62JytWP>>|y*xplyDZLP#GH+6F= zYiqC-T?gFU#RL0Rn3_{LmzMtQsRLn^BFS&9VE>Y1J@jYSgSEM1w?__!`{ypo(O6p# zjwxO=`f}b8)@PE+{%uwC+$<-jHnADEsPpg64pge5xoH<)@949>1%sxizTfkTZtF3p zDuQKiQLLKzQ^vfa<+L7k{N?i^+YLF>wE2s#I4IojYBMI(>Q^^k0>>Agzc#R1@u_|6n@I z-#4hZ*mmwTa)NY8R_6>3%|+UAB@3T;Ub52lS8fc|qK%@c3}9?DLp-pH?YcKTNA>BGj+!JL7$izN4Ng zVJbNb_K&`V+?{vn)&rpmJ8r@Lkuz57%Kba^5_(s{`4THwzLFKuowsR?$#%Clx=g!8 zc|?k~7~H1Kmpb2mXJ-V&F;HCSFs`|yWdd|KdXppo^~0qW;18MKe4 z=XvE`O*Db~jvupO{v9XTv#-#PEk+M0IcW^_UrKE6 z=hIi6mJGc+{VVKGhcm}nU80A-^P6fv3f70S=tUIo0=+x&fWpOfusq!Aj=ZVoXI(bx;6L=&0D(4g*_JbPs+cdAmk*iSrPksxe7X-357k;$LR@k&o!r-nn1mq zx?$W=`dQGu9W$(8f8$QhwNE%iJIt+dml*~7E5-UTY1DptR&&0=RW;O~)*7#~+D-2` zKfs}hvW2poOo{h)8oYB_e!T&n&s3wMn*Ihl;=_;yCiZZDRCLf?snxXR=V$Y7c%%0H z)5bin=JYZ50i0ffJp{W6b`ktVu#;d1!FGZIf^7s_3APYyCfG!F2)KL~y&_>JIK zf?o)JCfGpm6Ty!JKM;IR@EyT=f^`II3DyvNOYjZBYJ#r`RuOzfkXg3_LmUvfoZw4> zWdutZqo9D)=<{ve_!$RS7(jOYn+2vP+31Bjj= zhag3eFG}3C9Fa6CovpUhh60Lt|a z@YKBE_>D4Bew5`5^d!&de_IR3vy_~VXzW~2;BdlKrv{Fn;ec|E`#kVX(QEgnMmRpA zLYLjJS_o3he)YE6XhWGVGevs|h-~`GyRUlo8bi6UEXC0mOejd8Md!frCzW+* zbHQ?8DVR8Ni#r?-Qyj5*|EA|KrTqXZEi0d&%xI;JnF*0_RMv@Y6DPvm7UnPCmiIgTR(OA zD;p>~zj-@10?@@ZFSWNK|3x+0GLb-EyKzrKHQN9A3z7FD!3W>s{MlPM$bRm_xG1nJ z6oi;$p!*Zadt;`o0zZb%Z#V%^dDs&1&8xt;6peJ-g{VAsBR`&64Z;_~_fJ z662LxlImPS0;Qb_(-ZJKJ z0!VEeE4jPI7Ru#vvV93aV}@+y1{u^}=8f!GoCxCTc9%_85WxGjsd7KBC4!Zm^M1Cr zqw-v7ey5ZKel-v4c)1X@Uq|8V@FbuZMt?HVLH7@a>&ssxfkR(Mo2So(<9}+SPMLl( zFul={w;)FY$|eP6o07rw$JHyp-9~yZtIChb;BND28`V(M9#;8pr>6j&Qxl>`tTczR zsA5A-3V3>LzT4iBsQ>&vUU<6w@tIY$!`1tXa}L4r6SdFwh07}1S95dVuTf~cQM
  • NKHiJp{(VFVG*?7 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
  • Dr$i8=A*hfJjxDu4w;P=B>5*J_?x=l4Q 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 diff --git a/cart.db b/cart.db deleted file mode 100644 index a489d594f1d3d4ed7658ccd7646303e77a988fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3276 zcmd6py>HV%7{(9Lfdz@7OBeJ;45WjrCKX>3#CDR>Hc{2kgA9$A{TL#&37Mzz5tGL>1K)dSxPz*ZF{Q>j5P^0cu0uR@{!MC8WzwJ9Md#_n78vfe)T zR!6d0$eOz=5jY-eJ z3N~aH#AW@v^W$?QYXMm;g{rn;mN|ic46>D9dto8#lIvr4GMVqY93d%hVf<~3KM&`Z zA$Nqhx{f}1Jn}zl7yY=gu8(|rN_katAJhiqTU^w`O(btQnlMvVG>P zYn@(D&>z>S!cG8X)#5HJdVv$@gJVyiYZ20&vo4j4Odr&6&LSsB?d-GK3X?Ui!%<~J Qt0t`C$daV2ByNxW2YL}w>Hq)$ diff --git a/license.txt b/license.txt deleted file mode 100644 index 08c2ad76..00000000 --- a/license.txt +++ /dev/null @@ -1,35 +0,0 @@ -bsnes License: --------------- -You are free to redistribute this software, and its source code; provided -there is no charge for the software, nor any charge for the medium used to -distribute the software. You are also free to use and modify the source code -as you desire for personal use only. No publically-released derivative works -of this program nor its source code are permitted without my permission, -though I will likely grant you permission if you ask me. You must also abide -by the terms of any additional source code licenses contained within this -program. - -Simple DirectMedia Layer License: ---------------------------------- -The Simple DirectMedia Layer (SDL for short) is a cross-platform library -designed to make it easy to write multi-media software, such as games and -emulators. - -The Simple DirectMedia Layer library source code is available from: -http://www.libsdl.org/ - -This library is distributed under the terms of the GNU LGPL: -http://www.gnu.org/copyleft/lesser.html - -JMA License: ------------- -JMA is licensed under the GNU GPL. I have received special exemption from -Nach to use this library in bsnes. - -Licensing Exemptions: ---------------------- -libco, the cooperative multithreading library used by bsnes, is public domain. -You may obtain the latest version at: http://byuu.org/ - -Richard Bannister has asked for and received my permission to distribute -a binary-only port of bsnes on the Mac OS X platform. diff --git a/readme.txt b/readme.txt deleted file mode 100644 index 93926220..00000000 --- a/readme.txt +++ /dev/null @@ -1,98 +0,0 @@ -bsnes -Version 0.019 -Author: byuu - - -General -------- -bsnes is a Super Nintendo / Super Famicom emulator that began on -October 14th, 2004. - -The latest version can be downloaded from: -http://byuu.org/ - -Please see license.txt for important licensing information. - - -Known Limitations ------------------ -S-CPU -- Invalid DMA / HDMA transfers (eg WRAM<>WRAM) not fully emulated -- Multiply / Divide register delays not implemented - -S-SMP -- Cycle breakdown of opcodes is theoretical, but mostly correct - -S-PPU -- Uses scanline-based renderer. This is very inaccurate, but very - few games rely on mid-scanline writes to function correctly -- Does not support FirstSprite+Y priority -- OAM / CGRAM accesses during active display not supported correctly -- RTO flags are not calculated on frames that are skipped when frameskipping - is enabled. This provides a major speedup, however it will cause in issues - in games that test these flags, eg the SNES Test Program Electronics Test. - Turning frameskipping off will allow RTO flag calculation on every frame - -S-DSP -- Runs at 32khz. Hardware S-DSP likely runs at 1.024mhz to perform - multiple reads / writes per sample. Sound is still output at 32khz, - of course - -Hardware Bugs -- CPUr1 HDMA crashing bug not emulated -- CPU<>APU communication bus conflicts not emulated - - -Unsupported Hardware --------------------- -SA-1 -Coprocessor used in many popular games, including: -- Dragon Ball Z Hyper Dimension -- Kirby Super Star -- Kirby's Dreamland 3 -- Marvelous -- SD Gundam G-NEXT -- Super Mario RPG - -Super FX -Coprocessor used in many popular games, including: -- Doom -- Star Fox -- Star Fox 2 (unreleased beta) -- Super Mario World 2: Yoshi's Island - -SPC7110 -Coprocessor used only by the following games: -- Far East of Eden Zero -- Far East of Eden Zero: Shounen Jump no Shou -- Momotarou Densetsu Happy -- Super Power League 4 - -DSP-3 -Coprocessor used only by SD Gundam GX - -DSP-4 -Coprocessor used only by Top Gear 3000 - -ST010 / ST011 / ST018 -SETA coprocessors used by very few games - -BS-X (Broadcast Satellite) -Add-on unit sold only in Japan that played specially-made games that -were downloaded via satellite - -BS-X Flashcart -Flash cartridge used by BS-X, as well as some standalone games by -Asciisoft - -Super Gameboy -Cartridge passthrough used for playing Gameboy games - - -Unsupported controllers ------------------------ -Mouse -Super Scope -Justifier -Multitap (4-port) -Multitap (5-port) diff --git a/src/Makefile b/src/Makefile index 637da689..04b5389b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -13,19 +13,23 @@ endif ifeq ($(PLATFORM),x-gcc-lui) OS = unix CC = gcc -CFLAGS = -O3 -fomit-frame-pointer -ffast-math -DPLATFORM_X -DCOMPILER_GCC -DPROCESSOR_X86 -DUI_LUI `pkg-config --cflags gtk+-2.0` `sdl-config --cflags` +CFLAGS = -O3 -fomit-frame-pointer -ffast-math -DPLATFORM_X -DCOMPILER_GCC -DPROCESSOR_X86 -DUI_LUI `pkg-config --cflags gtk+-2.0` AS = nasm ASFLAGS = -f elf -LIBS = `pkg-config --libs gtk+-2.0` `sdl-config --libs` -lXv -lao +LIBS = `pkg-config --libs gtk+-2.0` -lXv -lao +LIBCO = libco_x86 +LIBUI = libui_gtk endif -ifeq ($(PLATFORM),x-gcc-sdl) +ifeq ($(PLATFORM),x-gcc-lui-x64) OS = unix CC = gcc -CFLAGS = -O3 -fomit-frame-pointer -ffast-math -DPLATFORM_X -DCOMPILER_GCC -DPROCESSOR_X86 -DUI_SDL `sdl-config --cflags` -AS = nasm -ASFLAGS = -f elf -LIBS = `sdl-config --libs` -lao +CFLAGS = -O3 -fomit-frame-pointer -ffast-math -DPLATFORM_X -DCOMPILER_GCC -DPROCESSOR_X86_64 -DUI_LUI `pkg-config --cflags gtk+-2.0` +AS = yasm +ASFLAGS = -f elf64 +LIBS = `pkg-config --libs gtk+-2.0` -lXv -lao +LIBCO = libco_x86_64 +LIBUI = libui_gtk endif ifeq ($(PLATFORM),win-visualc-lui) @@ -35,44 +39,32 @@ CFLAGS = /nologo /wd4996 /O2 /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR AS = nasm ASFLAGS = -f win32 -DWIN32 LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib +LIBCO = libco_x86 +LIBUI = libui_win endif -ifeq ($(PLATFORM),win-visualc) +ifeq ($(PLATFORM),win-visualc-lui-pgi) OS = win CC = cl -CFLAGS = /nologo /wd4996 /O2 /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN -AS = nasm -ASFLAGS = -f win32 -DWIN32 -LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib -endif - -ifeq ($(PLATFORM),win-visualc-pgi) -OS = win -CC = cl -CFLAGS = /nologo /wd4996 /O2 /GL /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN +CFLAGS = /nologo /wd4996 /O2 /GL /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_LUI AS = nasm ASFLAGS = -f win32 -DWIN32 LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib LINK = /link /PGD:bsnes.pgd /LTCG:PGINSTRUMENT +LIBCO = libco_x86 +LIBUI = libui_win endif -ifeq ($(PLATFORM),win-visualc-pgo) +ifeq ($(PLATFORM),win-visualc-lui-pgo) OS = win CC = cl -CFLAGS = /nologo /wd4996 /O2 /GL /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_WIN +CFLAGS = /nologo /wd4996 /O2 /GL /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_LUI AS = nasm ASFLAGS = -f win32 -DWIN32 LIBS = d3d9.lib ddraw.lib dsound.lib dinput8.lib dxguid.lib LINK = /link /PGD:bsnes.pgd /LTCG:PGOPTIMIZE -endif - -ifeq ($(PLATFORM),win-visualc-sdl) -OS = win -CC = cl -CFLAGS = /nologo /wd4996 /O2 /EHsc /DPLATFORM_WIN /DCOMPILER_VISUALC /DPROCESSOR_X86 /DUI_SDL -AS = nasm -ASFLAGS = -f win32 -DWIN32 -LIBS = sdlmain.lib sdl.lib dsound.lib +LIBCO = libco_x86 +LIBUI = libui_win endif ##################################### @@ -99,6 +91,10 @@ ifeq ($(AS),nasm) ASARGS = $< -o $@ endif +ifeq ($(AS),yasm) +ASARGS = $< -o $@ +endif + ################### ### OS switches ### ################### @@ -110,14 +106,15 @@ endif ifeq ($(OS),win) OUT := $(OUT).exe RM = del -LIBS += kernel32.lib user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib +LIBS += kernel32.lib user32.lib gdi32.lib shell32.lib winmm.lib comdlg32.lib comctl32.lib endif #################################### ### main target and dependencies ### #################################### -OBJECTS = main.$(OBJ) libco_x86.$(OBJ) libstring.$(OBJ) libconfig.$(OBJ) \ +OBJECTS = main.$(OBJ) $(LIBCO).$(OBJ) $(LIBUI).$(OBJ) \ + libstring.$(OBJ) \ reader.$(OBJ) cart.$(OBJ) cheat.$(OBJ) memory.$(OBJ) bmemory.$(OBJ) \ cpu.$(OBJ) scpu.$(OBJ) smp.$(OBJ) ssmp.$(OBJ) bdsp.$(OBJ) ppu.$(OBJ) \ bppu.$(OBJ) snes.$(OBJ) srtc.$(OBJ) sdd1.$(OBJ) c4.$(OBJ) dsp1.$(OBJ) \ @@ -160,16 +157,25 @@ all: $(OBJECTS) ######################### main.$(OBJ): ui/main.cpp config/* ui/* ui/video/* ui/audio/* ui/input/* \ ui/lui/* ui/lui/settings/* \ -ui/win/* ui/win/settings/* ui/win/debugger/* \ -ui/sdl/* +ui/win/* ui/win/settings/* ui/win/debugger/* bsnes.res : ui/bsnes.rc ; rc /r /fobsnes.res ui/bsnes.rc +############# +### libco ### +############# +libco_x86.$(OBJ) : lib/libco_x86.asm lib/* +libco_x86_64.$(OBJ): lib/libco_x86_64.asm lib/* + +############# +### libui ### +############# +libui_gtk.$(OBJ): lib/libui_gtk.cpp lib/* +libui_win.$(OBJ): lib/libui_win.cpp lib/* + ################# ### libraries ### ################# -libco_x86.$(OBJ): lib/libco_x86.asm lib/* libstring.$(OBJ): lib/libstring.cpp lib/* -libconfig.$(OBJ): lib/libconfig.cpp lib/* ################# ### utilities ### @@ -199,6 +205,7 @@ ssmp.$(OBJ): smp/ssmp/ssmp.cpp smp/ssmp/* smp/ssmp/core/* smp/ssmp/memory/* smp/ ########### ### dsp ### ########### +adsp.$(OBJ): dsp/adsp/adsp.cpp dsp/adsp/* bdsp.$(OBJ): dsp/bdsp/bdsp.cpp dsp/bdsp/* ########### @@ -210,7 +217,7 @@ bppu.$(OBJ): ppu/bppu/bppu.cpp ppu/bppu/* ############ ### snes ### ############ -snes.$(OBJ): snes/snes.cpp snes/* snes/video/* snes/audio/* snes/input/* +snes.$(OBJ): snes/snes.cpp snes/* snes/scheduler/* snes/video/* snes/audio/* snes/input/* ##################### ### special chips ### diff --git a/src/base.h b/src/base.h index ef91c2d6..27403a25 100644 --- a/src/base.h +++ b/src/base.h @@ -1,4 +1,4 @@ -#define BSNES_VERSION "0.019.09" +#define BSNES_VERSION "0.020" #define BSNES_TITLE "bsnes v" BSNES_VERSION #define MEMCORE bMemBus @@ -17,36 +17,32 @@ //(allow runtime cpu/smp/dsp/ppu/bus selection, ~10% speed hit) //#define POLYMORPHISM +#include "lib/libbase.h" + #if defined(PROCESSOR_X86) #define ARCH_LSB + #include "lib/libco_x86.h" #elif defined(PROCESSOR_X86_64) #define ARCH_LSB + #include "lib/libco_x86_64.h" #elif defined(PROCESSOR_G5) #define ARCH_MSB #else #error "unsupported processor" #endif -#include "lib/libbase.h" +#include "lib/libinterp.h" #include "lib/libsort.h" -#include "lib/libco_x86.h" #include "lib/libarray.h" #include "lib/libvector.h" +#include "lib/libfile.h" #include "lib/libstring.h" #include "lib/libconfig.h" -inline uint16 read16(uint8 *addr, uint pos) { -#ifdef ARCH_LSB - return *((uint16*)(addr + pos)); -#else - return (addr[pos]) | (addr[pos + 1] << 8); -#endif -} - //platform-specific global functions -void alert(char *, ...); -void dprintf(char *, ...); -void dprintf(uint, char *, ...); +void alert(char*, ...); +void dprintf(char*, ...); +void dprintf(uint, char*, ...); namespace source { enum { diff --git a/src/bsnes.lnk b/src/bsnes.lnk index 36540493c288462787e405378d27cf88255641e8..8a244e95f909d2cb883e87a65c16a5afd9c0881c 100644 GIT binary patch literal 587 zcmeZaU|?VrVFHp231%+2unF5P$a4={a7|fMq(2uf;L8yYWOc)Ho>@8+Ob^;7V`S~RvYnd5X z7~bz&X0~wGRI4EaC^lmr@Y2Gz6GOj1gKA*nbowU|K(MUSKuNKX<&F+(0h zDv$)}a$+!I067|@O97%wFSR0-K?|yLtC@t3uoq9n16+q0uAOXZ~Kr92qAWws6 zT_6SlS0EMyVrC%jb57O~0MZOV4}<&@19l*U1Y5|!!=ML*F-Y!%*}}^Z#b5=Lf%z6$ zjRGFI7@!}E7?OcHQy3C~p_GVbdL~dVpCJM0D4+`$M1Wie1WA>prNxPP5Dt*k;Q7a1 l$HC##ZvQDLy-9!HnHM~}JlXFEHd(NEH#9Ub6OsoR1OOVMc{~6B literal 1267 zcmeZaU|?VrVFHp23ZWxokTFQ0Z9%rD>ot7HU| z2;w$_2!njU1OE#OudFf!7Tw@r&^9obE6JemY!!o01!tKs7=qae@qOF-5# zGq5nc-v<)YGi6W^0jels$Ol58B+z&>xSrcUJxRrRsl^ORa6Px-dXgB58S)rXfh0(m z6N3>01JKcWrkTbH5M6qy6{!qbP@N!gm~9B1dO-aZK+M1(0mN=VECa+KPlIS(AO-_7+!wvd6JK@SLHpd_YUybR6^RzP`}pJNyhYQ*u# zA*+MATLkDNb_Rw8s=<}TC8@bCMVV!(syN&Qa`bQpstmylmB7?c0*udG1{YxXW-^ok z*{V3g8e4cWFifn0h0%{dF&L9-v<4&>;xy0E+P?hWL69^jI2GRca)wdj-GrJ04ijts z1HocyWd?;N=-cn0x^%L_QZt2X1Qs`hgQ{2h0x!pU!}DGS2J{b&&#)KEuci z&J7?TkR1*n1{Pq(AjJeSzvlHBMxE+!lRHOGONgN>8HfN?5Z#S5U^OueR>g+Qzb#0fkiVExEyb^z5}0or#1h(FJ4 Nu2}(82MQyQApmPa+-?8> diff --git a/src/bsnes_lui.cfg b/src/bsnes_lui.cfg deleted file mode 100644 index ada80bf5..00000000 --- a/src/bsnes_lui.cfg +++ /dev/null @@ -1,181 +0,0 @@ -# Default path to look for ROM files in ("" = use default directory) -# (default = "") -path.rom = "/dos/Documents and Settings/byuu/Desktop/snes_testroms" - -# Default path for all save RAM and cheat files ("" = use current directory) -# (default = "") -path.save = "" - -# Path where BIOS file(s) are located -# Supported BIOS files: -# stbios.bin - Bandai Sufami Turbo -# (default = "./bios") -path.bios = "./bios" - -# Extension to be used for all save RAM files -# (default = "srm") -path.save_ext = "srm" - -# Use precalculated TV-style gamma ramp -# (default = true) -snes.colorfilter.gamma_ramp = true - -# Convert color to sepia tone -# (default = false) -snes.colorfilter.sepia = false - -# Convert color to grayscale tone -# (default = false) -snes.colorfilter.grayscale = false - -# Invert output image colors -# (default = false) -snes.colorfilter.invert = false - -# Contrast -# (default = 0) -snes.colorfilter.contrast = 0 - -# Brightness -# (default = 0) -snes.colorfilter.brightness = 0 - -# Gamma -# (default = 80) -snes.colorfilter.gamma = 80 - -# Merge fields in NTSC video filter -# Set to true if using filter at any refresh rate other than 60hz -# -# (default = true) -snes.ntsc_merge_fields = true - -# Mutes SNES audio output when enabled -# (default = false) -snes.mute = false - -# Controller attached to SNES port 1 -# (default = 1) -snes.controller_port_1 = 1 - -# Controller attached to SNES port 2 -# (default = 2) -snes.controller_port_2 = 2 - -# NTSC S-CPU clock rate (in hz) -# (default = 21477272) -cpu.ntsc_clock_rate = 21477272 - -# PAL S-CPU clock rate (in hz) -# (default = 21281370) -cpu.pal_clock_rate = 21281370 - -# NTSC S-SMP clock rate (in hz) -# (default = 24606720) -smp.ntsc_clock_rate = 24606720 - -# PAL S-SMP clock rate (in hz) -# (default = 24606720) -smp.pal_clock_rate = 24606720 - -# Approximate HCLOCK position to render at for scanline-based renderers -# (default = 512) -ppu.hack.render_scanline_position = 512 - -# Cache OAM OBJ attributes one scanline before rendering -# This is technically closer to the actual operation of the SNES, -# but can cause problems in many games if enabled -# (default = false) -ppu.hack.obj_cache = false - -# Video hardware interface -# (default = "") -system.video = "" - -# Audio hardware interface -# (default = "") -system.audio = "" - -# Input hardware interface -# (default = "") -system.input = "" - -# Regulate speed to 60hz (NTSC) / 50hz (PAL) -# (default = true) -system.regulate_speed = true - -# Slowest speed setting (in hz) -# (default = 16000) -system.speed_slowest = 16000 - -# Slow speed setting -# (default = 24000) -system.speed_slow = 24000 - -# Normal speed setting -# (default = 32000) -system.speed_normal = 32000 - -# Fast speed setting -# (default = 48000) -system.speed_fast = 48000 - -# Fastest speed setting -# (default = 64000) -system.speed_fastest = 64000 - -# Windowed video profile configuration -# If available, please use bsnes GUI configuration editor to modify video profile settings -# Format: software_filter;hardware_filter;video_standard;multiplier;correct_aspect_ratio; -# enable_scanlines;manual_render_size;render_width;render_height; -# triple_buffering;resolution_width;resolution_height;refresh_rate -# (default = "0;1;0;2;true;false;false;595;448;false;0;0;0") -video.profile_win = "0;1;0;2;true;false;false;595;448;false;0;0;0" - -# Fullscreen video profile configuration -# (default = "0;1;0;2;true;false;false;595;448;false;0;0;0") -video.profile_full = "0;1;0;2;true;false;false;595;448;false;0;0;0" - -# Use Video RAM instead of System RAM -# (default = true) -video.use_vram = true - -# Progressive scanline intensity -# Value is percentage of intensity from 0 to 100 -# (default = 30) -video.pscanline_intensity = 30 - -# Interlace scanline intensity -# (default = 50) -video.iscanline_intensity = 50 - -# Axis resistance for all analog joypads -# Affects responsiveness of analog stick movement by specifying what percentage -# in any given direction the axis must be pressed to trigger a button press. -# In other words, this determines how hard you have to press the analog stick to -# simulate pressing e.g. left or right on a digital joypad. -# Value is a percentage, from 0 (axis will trigger with virtually any axis movement) -# up to 100 (axis must be pressed fully to given corner). -# Value affects all four directions of the axis equally. -# Note: Values below 10 or above 90 are not recommended and may not work at all. -# (default = 75) -input.axis_resistance = 75 - -# Allow up+down and left+right key combinations for joypad 1 (not recommended) -# (default = false) -input.joypad1.allow_invalid_input = false - -# Joypad 1 button map -# Format: Up; Down; Left; Right; A; B; X; Y; L; R; Select; Start -# (default = "up | joypad0.up; down | joypad0.down; left | joypad0.left; right | joypad0.right; x | joypad0.button3; z | joypad0.button2; s | joypad0.button1; a | joypad0.button0; d | joypad0.button6; c | joypad0.button7; rshift | joypad0.button4; enter | joypad0.button5") -input.joypad1.map = "up | joypad0.up; down | joypad0.down; left | joypad0.left; right | joypad0.right; x | joypad0.button3; z | joypad0.button2; s | joypad0.button1; a | joypad0.button0; d | joypad0.button6; c | joypad0.button7; rshift | joypad0.button4; enter | joypad0.button5" - -# Allow up+down and left+right key combinations for joypad 2 (not recommended) -# (default = false) -input.joypad2.allow_invalid_input = false - -# Joypad 2 button map -# Format: Up; Down; Left; Right; A; B; X; Y; L; R; Select; Start -# (default = "t | joypad1.up; g | joypad1.down; f | joypad1.left; h | joypad1.right; k | joypad1.button3; j | joypad1.button2; i | joypad1.button1; u | joypad1.button0; o | joypad1.button6; l | joypad1.button7; lbracket | joypad1.button4; rbracket | joypad1.button5") -input.joypad2.map = "t | joypad1.up; g | joypad1.down; f | joypad1.left; h | joypad1.right; k | joypad1.button3; j | joypad1.button2; i | joypad1.button1; u | joypad1.button0; o | joypad1.button6; l | joypad1.button7; lbracket | joypad1.button4; rbracket | joypad1.button5" - diff --git a/src/cart/cart.cpp b/src/cart/cart.cpp index f868d984..ac1a6026 100644 --- a/src/cart/cart.cpp +++ b/src/cart/cart.cpp @@ -128,8 +128,8 @@ bool Cartridge::unload() { } break; } - SafeFree(rom); - SafeFree(ram); + safe_free(rom); + safe_free(ram); if(cheat.count() > 0 || fexists(file.cheat_name) == true) { cheat.save(file.cheat_name); diff --git a/src/cc.bat b/src/cc.bat index 2457be0e..9ddfe888 100644 --- a/src/cc.bat +++ b/src/cc.bat @@ -1,3 +1,3 @@ -@make -r PLATFORM=win-visualc +@make -r PLATFORM=win-visualc-lui @move bsnes.exe ../bsnes.exe>nul @pause \ No newline at end of file diff --git a/src/cc.sh b/src/cc.sh index 6c958cef..49c6608f 100644 --- a/src/cc.sh +++ b/src/cc.sh @@ -1,2 +1,2 @@ #!/bin/sh -gmake PLATFORM=x-gcc-lui +make PLATFORM=x-gcc-lui \ No newline at end of file diff --git a/src/cheat/cheat.cpp b/src/cheat/cheat.cpp index e5506c1a..8726c684 100644 --- a/src/cheat/cheat.cpp +++ b/src/cheat/cheat.cpp @@ -277,7 +277,7 @@ uint8 *raw_data = rf.read(); stringarray data, line; raw_data[rf.size()] = 0; strcpy(data, (char*)raw_data); - SafeFree(raw_data); + safe_free(raw_data); replace(data, "\r\n", "\n"); split(line, "\n", data); diff --git a/src/chip/sdd1/sdd1emu.h b/src/chip/sdd1/sdd1emu.h index 94b723da..a9ff01fe 100644 --- a/src/chip/sdd1/sdd1emu.h +++ b/src/chip/sdd1/sdd1emu.h @@ -28,6 +28,7 @@ understood. ************************************************************************/ +typedef uint8_t bool8; class SDD1_IM { //Input Manager diff --git a/src/clean.bat b/src/clean.bat index c63abd8d..134107c6 100644 --- a/src/clean.bat +++ b/src/clean.bat @@ -1 +1 @@ -@make PLATFORM=win-visualc clean +@make PLATFORM=win-visualc-lui clean diff --git a/src/clean.sh b/src/clean.sh index 5cf78518..0b82ddb6 100644 --- a/src/clean.sh +++ b/src/clean.sh @@ -1,2 +1,2 @@ #!/bin/sh -gmake PLATFORM=x-gcc-lui clean +make PLATFORM=x-gcc-lui clean \ No newline at end of file diff --git a/src/config/config.cpp b/src/config/config.cpp index 3a045834..9ba34a87 100644 --- a/src/config/config.cpp +++ b/src/config/config.cpp @@ -25,83 +25,83 @@ stringarray part; return path; } -Setting Path::base(0, "fs.base_path", +StringSetting Path::base(0, "fs.base_path", "Path that bsnes resides in", ""); -Setting Path::rom(&config_file, "path.rom", +StringSetting Path::rom(&config_file, "path.rom", "Default path to look for ROM files in (\"\" = use default directory)", ""); -Setting Path::save(&config_file, "path.save", +StringSetting Path::save(&config_file, "path.save", "Default path for all save RAM and cheat files (\"\" = use current directory)", ""); -Setting Path::bios(&config_file, "path.bios", +StringSetting Path::bios(&config_file, "path.bios", "Path where BIOS file(s) are located\n" "Supported BIOS files:\n" "stbios.bin - Bandai Sufami Turbo" "", "./bios"); -Setting Path::save_ext(&config_file, "path.save_ext", +StringSetting Path::save_ext(&config_file, "path.save_ext", "Extension to be used for all save RAM files", "srm"); -Setting SNES::gamma_ramp(&config_file, "snes.colorfilter.gamma_ramp", - "Use precalculated TV-style gamma ramp", true, Setting::BOOL); -Setting SNES::sepia(&config_file, "snes.colorfilter.sepia", - "Convert color to sepia tone", false, Setting::BOOL); -Setting SNES::grayscale(&config_file, "snes.colorfilter.grayscale", - "Convert color to grayscale tone", false, Setting::BOOL); -Setting SNES::invert(&config_file, "snes.colorfilter.invert", - "Invert output image colors", false, Setting::BOOL); -Setting SNES::contrast(&config_file, "snes.colorfilter.contrast", - "Contrast", 0, Setting::DEC); -Setting SNES::brightness(&config_file, "snes.colorfilter.brightness", - "Brightness", 0, Setting::DEC); -Setting SNES::gamma(&config_file, "snes.colorfilter.gamma", - "Gamma", 80, Setting::DEC); +IntegerSetting SNES::gamma_ramp(&config_file, "snes.colorfilter.gamma_ramp", + "Use precalculated TV-style gamma ramp", IntegerSetting::Boolean, true); +IntegerSetting SNES::sepia(&config_file, "snes.colorfilter.sepia", + "Convert color to sepia tone", IntegerSetting::Boolean, false); +IntegerSetting SNES::grayscale(&config_file, "snes.colorfilter.grayscale", + "Convert color to grayscale tone", IntegerSetting::Boolean, false); +IntegerSetting SNES::invert(&config_file, "snes.colorfilter.invert", + "Invert output image colors", IntegerSetting::Boolean, false); +IntegerSetting SNES::contrast(&config_file, "snes.colorfilter.contrast", + "Contrast", IntegerSetting::Decimal, 0); +IntegerSetting SNES::brightness(&config_file, "snes.colorfilter.brightness", + "Brightness", IntegerSetting::Decimal, 0); +IntegerSetting SNES::gamma(&config_file, "snes.colorfilter.gamma", + "Gamma", IntegerSetting::Decimal, 80); -Setting SNES::ntsc_merge_fields(&config_file, "snes.ntsc_merge_fields", +IntegerSetting SNES::ntsc_merge_fields(&config_file, "snes.ntsc_merge_fields", "Merge fields in NTSC video filter\n" "Set to true if using filter at any refresh rate other than 60hz\n" - "", true, Setting::BOOL); + "", IntegerSetting::Boolean, true); -Setting SNES::mute(&config_file, "snes.mute", "Mutes SNES audio output when enabled", - false, Setting::BOOL); +IntegerSetting SNES::mute(&config_file, "snes.mute", "Mutes SNES audio output when enabled", + IntegerSetting::Boolean, false); -Setting SNES::controller_port0(&config_file, "snes.controller_port_1", - "Controller attached to SNES port 1", ::SNES::DEVICEID_JOYPAD1, Setting::DEC); -Setting SNES::controller_port1(&config_file, "snes.controller_port_2", - "Controller attached to SNES port 2", ::SNES::DEVICEID_JOYPAD2, Setting::DEC); +IntegerSetting SNES::controller_port0(&config_file, "snes.controller_port_1", + "Controller attached to SNES port 1", IntegerSetting::Decimal, ::SNES::DEVICEID_JOYPAD1); +IntegerSetting SNES::controller_port1(&config_file, "snes.controller_port_2", + "Controller attached to SNES port 2", IntegerSetting::Decimal, ::SNES::DEVICEID_JOYPAD2); -Setting CPU::ntsc_clock_rate(&config_file, "cpu.ntsc_clock_rate", - "NTSC S-CPU clock rate (in hz)", 21477272, Setting::DEC); -Setting CPU::pal_clock_rate(&config_file, "cpu.pal_clock_rate", - "PAL S-CPU clock rate (in hz)", 21281370, Setting::DEC); +IntegerSetting CPU::ntsc_clock_rate(&config_file, "cpu.ntsc_clock_rate", + "NTSC S-CPU clock rate (in hz)", IntegerSetting::Decimal, 21477272); +IntegerSetting CPU::pal_clock_rate(&config_file, "cpu.pal_clock_rate", + "PAL S-CPU clock rate (in hz)", IntegerSetting::Decimal, 21281370); -Setting CPU::hdma_enable(0, "cpu.hdma_enable", - "Enable HDMA effects", true, Setting::BOOL); +IntegerSetting CPU::hdma_enable(0, "cpu.hdma_enable", + "Enable HDMA effects", IntegerSetting::Boolean, true); -Setting SMP::ntsc_clock_rate(&config_file, "smp.ntsc_clock_rate", - "NTSC S-SMP clock rate (in hz)", 24606720, Setting::DEC); -Setting SMP::pal_clock_rate(&config_file, "smp.pal_clock_rate", - "PAL S-SMP clock rate (in hz)", 24606720, Setting::DEC); +IntegerSetting SMP::ntsc_clock_rate(&config_file, "smp.ntsc_clock_rate", + "NTSC S-SMP clock rate (in hz)", IntegerSetting::Decimal, 24606720); +IntegerSetting SMP::pal_clock_rate(&config_file, "smp.pal_clock_rate", + "PAL S-SMP clock rate (in hz)", IntegerSetting::Decimal, 24606720); -Setting PPU::Hack::render_scanline_position(&config_file, "ppu.hack.render_scanline_position", +IntegerSetting PPU::Hack::render_scanline_position(&config_file, "ppu.hack.render_scanline_position", "Approximate HCLOCK position to render at for scanline-based renderers", - 512, Setting::DEC); -Setting PPU::Hack::obj_cache(&config_file, "ppu.hack.obj_cache", + IntegerSetting::Decimal, 512); +IntegerSetting PPU::Hack::obj_cache(&config_file, "ppu.hack.obj_cache", "Cache OAM OBJ attributes one scanline before rendering\n" "This is technically closer to the actual operation of the SNES,\n" - "but can cause problems in many games if enabled", - false, Setting::BOOL); + "but can cause problems in some games if enabled", + IntegerSetting::Boolean, false); -Setting PPU::opt_enable(0, "ppu.opt_enable", "Enable offset-per-tile effects", true, Setting::BOOL); -Setting PPU::bg1_pri0_enable(0, "ppu.bg1_pri0_enable", "Enable BG1 Priority 0", true, Setting::BOOL); -Setting PPU::bg1_pri1_enable(0, "ppu.bg1_pri1_enable", "Enable BG1 Priority 1", true, Setting::BOOL); -Setting PPU::bg2_pri0_enable(0, "ppu.bg2_pri0_enable", "Enable BG2 Priority 0", true, Setting::BOOL); -Setting PPU::bg2_pri1_enable(0, "ppu.bg2_pri1_enable", "Enable BG2 Priority 1", true, Setting::BOOL); -Setting PPU::bg3_pri0_enable(0, "ppu.bg3_pri0_enable", "Enable BG3 Priority 0", true, Setting::BOOL); -Setting PPU::bg3_pri1_enable(0, "ppu.bg3_pri1_enable", "Enable BG3 Priority 1", true, Setting::BOOL); -Setting PPU::bg4_pri0_enable(0, "ppu.bg4_pri0_enable", "Enable BG4 Priority 0", true, Setting::BOOL); -Setting PPU::bg4_pri1_enable(0, "ppu.bg4_pri1_enable", "Enable BG4 Priority 1", true, Setting::BOOL); -Setting PPU::oam_pri0_enable(0, "ppu.oam_pri0_enable", "Enable OAM Priority 0", true, Setting::BOOL); -Setting PPU::oam_pri1_enable(0, "ppu.oam_pri1_enable", "Enable OAM Priority 1", true, Setting::BOOL); -Setting PPU::oam_pri2_enable(0, "ppu.oam_pri2_enable", "Enable OAM Priority 2", true, Setting::BOOL); -Setting PPU::oam_pri3_enable(0, "ppu.oam_pri3_enable", "Enable OAM Priority 3", true, Setting::BOOL); +IntegerSetting PPU::opt_enable(0, "ppu.opt_enable", "Enable offset-per-tile effects", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg1_pri0_enable(0, "ppu.bg1_pri0_enable", "Enable BG1 Priority 0", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg1_pri1_enable(0, "ppu.bg1_pri1_enable", "Enable BG1 Priority 1", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg2_pri0_enable(0, "ppu.bg2_pri0_enable", "Enable BG2 Priority 0", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg2_pri1_enable(0, "ppu.bg2_pri1_enable", "Enable BG2 Priority 1", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg3_pri0_enable(0, "ppu.bg3_pri0_enable", "Enable BG3 Priority 0", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg3_pri1_enable(0, "ppu.bg3_pri1_enable", "Enable BG3 Priority 1", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg4_pri0_enable(0, "ppu.bg4_pri0_enable", "Enable BG4 Priority 0", IntegerSetting::Boolean, true); +IntegerSetting PPU::bg4_pri1_enable(0, "ppu.bg4_pri1_enable", "Enable BG4 Priority 1", IntegerSetting::Boolean, true); +IntegerSetting PPU::oam_pri0_enable(0, "ppu.oam_pri0_enable", "Enable OAM Priority 0", IntegerSetting::Boolean, true); +IntegerSetting PPU::oam_pri1_enable(0, "ppu.oam_pri1_enable", "Enable OAM Priority 1", IntegerSetting::Boolean, true); +IntegerSetting PPU::oam_pri2_enable(0, "ppu.oam_pri2_enable", "Enable OAM Priority 2", IntegerSetting::Boolean, true); +IntegerSetting PPU::oam_pri3_enable(0, "ppu.oam_pri3_enable", "Enable OAM Priority 3", IntegerSetting::Boolean, true); }; diff --git a/src/config/config.h b/src/config/config.h index d0c4baba..6cc53222 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -5,40 +5,40 @@ namespace config { string file_updatepath(const char *, const char *); extern struct Path { - static Setting base, rom, save, bios; - static Setting save_ext; + static StringSetting base, rom, save, bios; + static StringSetting save_ext; } path; extern struct SNES { - static Setting gamma_ramp, sepia, grayscale, invert, contrast, brightness, gamma; - static Setting ntsc_merge_fields; - static Setting mute; - static Setting controller_port0; - static Setting controller_port1; + static IntegerSetting gamma_ramp, sepia, grayscale, invert, contrast, brightness, gamma; + static IntegerSetting ntsc_merge_fields; + static IntegerSetting mute; + static IntegerSetting controller_port0; + static IntegerSetting controller_port1; } snes; extern struct CPU { - static Setting ntsc_clock_rate, pal_clock_rate; - static Setting hdma_enable; + static IntegerSetting ntsc_clock_rate, pal_clock_rate; + static IntegerSetting hdma_enable; } cpu; extern struct SMP { - static Setting ntsc_clock_rate, pal_clock_rate; + static IntegerSetting ntsc_clock_rate, pal_clock_rate; } smp; extern struct PPU { struct Hack { - static Setting render_scanline_position; - static Setting obj_cache; + static IntegerSetting render_scanline_position; + static IntegerSetting obj_cache; } hack; - static Setting opt_enable; - static Setting bg1_pri0_enable, bg1_pri1_enable; - static Setting bg2_pri0_enable, bg2_pri1_enable; - static Setting bg3_pri0_enable, bg3_pri1_enable; - static Setting bg4_pri0_enable, bg4_pri1_enable; - static Setting oam_pri0_enable, oam_pri1_enable; - static Setting oam_pri2_enable, oam_pri3_enable; + static IntegerSetting opt_enable; + static IntegerSetting bg1_pri0_enable, bg1_pri1_enable; + static IntegerSetting bg2_pri0_enable, bg2_pri1_enable; + static IntegerSetting bg3_pri0_enable, bg3_pri1_enable; + static IntegerSetting bg4_pri0_enable, bg4_pri1_enable; + static IntegerSetting oam_pri0_enable, oam_pri1_enable; + static IntegerSetting oam_pri2_enable, oam_pri3_enable; } ppu; }; diff --git a/src/cpu/cpuregs.h b/src/cpu/cpuregs.h index 8a7e8754..5b502044 100644 --- a/src/cpu/cpuregs.h +++ b/src/cpu/cpuregs.h @@ -3,7 +3,7 @@ public: union { uint8 data; struct { - uint8 order_msb8(n:1, v:1, m:1, x:1, d:1, i:1, z:1, c:1); + bool order_msb8(n:1, v:1, m:1, x:1, d:1, i:1, z:1, c:1); }; }; diff --git a/src/cpu/scpu/core/core.cpp b/src/cpu/scpu/core/core.cpp index b8981f41..aea39dd1 100644 --- a/src/cpu/scpu/core/core.cpp +++ b/src/cpu/scpu/core/core.cpp @@ -1,33 +1,31 @@ #include "opfn.cpp" -void sCPU::enter() { - for(;;) { - if(event.irq) { - event.irq = false; - if(status.nmi_pending == true) { - status.nmi_pending = false; - event.irq_vector = (regs.e == false) ? 0xffea : 0xfffa; - } else if(status.irq_pending == true) { - status.irq_pending = false; - event.irq_vector = (regs.e == false) ? 0xffee : 0xfffe; - } - op_irq(); +#include "op_read.cpp" +#include "op_write.cpp" +#include "op_rmw.cpp" +#include "op_pc.cpp" +#include "op_misc.cpp" + +void sCPU::enter() { loop: + if(event.irq) { + event.irq = false; + if(status.nmi_pending == true) { + status.nmi_pending = false; + event.irq_vector = (regs.e == false) ? 0xffea : 0xfffa; + } else if(status.irq_pending == true) { + status.irq_pending = false; + event.irq_vector = (regs.e == false) ? 0xffee : 0xfffe; } - - tracer.trace_cpuop(); //traces CPU opcode (only if tracer is enabled) - - status.in_opcode = true; - - switch(op_readpc()) { - #include "op_read.cpp" - #include "op_write.cpp" - #include "op_rmw.cpp" - #include "op_pc.cpp" - #include "op_misc.cpp" - } - - status.in_opcode = false; + op_irq(); } + + tracer.trace_cpuop(); //traces CPU opcode (only if tracer is enabled) + + status.in_opcode = true; + (this->*optbl[op_readpc()])(); + status.in_opcode = false; + + goto loop; } void sCPU::op_irq() { diff --git a/src/cpu/scpu/core/core.h b/src/cpu/scpu/core/core.h index ce2b6794..9097197f 100644 --- a/src/cpu/scpu/core/core.h +++ b/src/cpu/scpu/core/core.h @@ -1,4 +1,4 @@ -//void (sCPU::*optbl[256])(); +void (sCPU::*optbl[256])(); CPUReg24 aa, rd; uint8 dp, sp; @@ -54,4 +54,4 @@ uint8 dp, sp; void op_io_cond4(uint16 x, uint16 y); void op_io_cond6(uint16 addr); -//#include "op.h" +#include "op.h" diff --git a/src/cpu/scpu/core/op.h b/src/cpu/scpu/core/op.h new file mode 100644 index 00000000..aea4a5a7 --- /dev/null +++ b/src/cpu/scpu/core/op.h @@ -0,0 +1,256 @@ +void op_adc_const(); +void op_and_const(); +void op_cmp_const(); +void op_cpx_const(); +void op_cpy_const(); +void op_eor_const(); +void op_lda_const(); +void op_ldx_const(); +void op_ldy_const(); +void op_ora_const(); +void op_sbc_const(); +void op_adc_addr(); +void op_and_addr(); +void op_bit_addr(); +void op_cmp_addr(); +void op_cpx_addr(); +void op_cpy_addr(); +void op_eor_addr(); +void op_lda_addr(); +void op_ldx_addr(); +void op_ldy_addr(); +void op_ora_addr(); +void op_sbc_addr(); +void op_adc_addrx(); +void op_and_addrx(); +void op_bit_addrx(); +void op_cmp_addrx(); +void op_eor_addrx(); +void op_lda_addrx(); +void op_ldy_addrx(); +void op_ora_addrx(); +void op_sbc_addrx(); +void op_adc_addry(); +void op_and_addry(); +void op_cmp_addry(); +void op_eor_addry(); +void op_lda_addry(); +void op_ldx_addry(); +void op_ora_addry(); +void op_sbc_addry(); +void op_adc_long(); +void op_and_long(); +void op_cmp_long(); +void op_eor_long(); +void op_lda_long(); +void op_ora_long(); +void op_sbc_long(); +void op_adc_longx(); +void op_and_longx(); +void op_cmp_longx(); +void op_eor_longx(); +void op_lda_longx(); +void op_ora_longx(); +void op_sbc_longx(); +void op_adc_dp(); +void op_and_dp(); +void op_bit_dp(); +void op_cmp_dp(); +void op_cpx_dp(); +void op_cpy_dp(); +void op_eor_dp(); +void op_lda_dp(); +void op_ldx_dp(); +void op_ldy_dp(); +void op_ora_dp(); +void op_sbc_dp(); +void op_adc_dpx(); +void op_and_dpx(); +void op_bit_dpx(); +void op_cmp_dpx(); +void op_eor_dpx(); +void op_lda_dpx(); +void op_ldy_dpx(); +void op_ora_dpx(); +void op_sbc_dpx(); +void op_ldx_dpy(); +void op_adc_idp(); +void op_and_idp(); +void op_cmp_idp(); +void op_eor_idp(); +void op_lda_idp(); +void op_ora_idp(); +void op_sbc_idp(); +void op_adc_idpx(); +void op_and_idpx(); +void op_cmp_idpx(); +void op_eor_idpx(); +void op_lda_idpx(); +void op_ora_idpx(); +void op_sbc_idpx(); +void op_adc_idpy(); +void op_and_idpy(); +void op_cmp_idpy(); +void op_eor_idpy(); +void op_lda_idpy(); +void op_ora_idpy(); +void op_sbc_idpy(); +void op_adc_ildp(); +void op_and_ildp(); +void op_cmp_ildp(); +void op_eor_ildp(); +void op_lda_ildp(); +void op_ora_ildp(); +void op_sbc_ildp(); +void op_adc_ildpy(); +void op_and_ildpy(); +void op_cmp_ildpy(); +void op_eor_ildpy(); +void op_lda_ildpy(); +void op_ora_ildpy(); +void op_sbc_ildpy(); +void op_adc_sr(); +void op_and_sr(); +void op_cmp_sr(); +void op_eor_sr(); +void op_lda_sr(); +void op_ora_sr(); +void op_sbc_sr(); +void op_adc_isry(); +void op_and_isry(); +void op_cmp_isry(); +void op_eor_isry(); +void op_lda_isry(); +void op_ora_isry(); +void op_sbc_isry(); +void op_bit_const(); +void op_sta_addr(); +void op_stx_addr(); +void op_sty_addr(); +void op_stz_addr(); +void op_sta_addrx(); +void op_stz_addrx(); +void op_sta_addry(); +void op_sta_long(); +void op_sta_longx(); +void op_sta_dp(); +void op_stx_dp(); +void op_sty_dp(); +void op_stz_dp(); +void op_sta_dpx(); +void op_sty_dpx(); +void op_stz_dpx(); +void op_stx_dpy(); +void op_sta_idp(); +void op_sta_ildp(); +void op_sta_idpx(); +void op_sta_idpy(); +void op_sta_ildpy(); +void op_sta_sr(); +void op_sta_isry(); +void op_inc(); +void op_inx(); +void op_iny(); +void op_dec(); +void op_dex(); +void op_dey(); +void op_asl(); +void op_lsr(); +void op_rol(); +void op_ror(); +void op_inc_addr(); +void op_dec_addr(); +void op_asl_addr(); +void op_lsr_addr(); +void op_rol_addr(); +void op_ror_addr(); +void op_trb_addr(); +void op_tsb_addr(); +void op_inc_addrx(); +void op_dec_addrx(); +void op_asl_addrx(); +void op_lsr_addrx(); +void op_rol_addrx(); +void op_ror_addrx(); +void op_inc_dp(); +void op_dec_dp(); +void op_asl_dp(); +void op_lsr_dp(); +void op_rol_dp(); +void op_ror_dp(); +void op_trb_dp(); +void op_tsb_dp(); +void op_inc_dpx(); +void op_dec_dpx(); +void op_asl_dpx(); +void op_lsr_dpx(); +void op_rol_dpx(); +void op_ror_dpx(); +void op_bcc(); +void op_bcs(); +void op_bne(); +void op_beq(); +void op_bpl(); +void op_bmi(); +void op_bvc(); +void op_bvs(); +void op_bra(); +void op_brl(); +void op_jmp_addr(); +void op_jmp_long(); +void op_jmp_iaddr(); +void op_jmp_iaddrx(); +void op_jmp_iladdr(); +void op_jsr_addr(); +void op_jsr_long(); +void op_jsr_iaddrx(); +void op_rti(); +void op_rts(); +void op_rtl(); +void op_nop(); +void op_wdm(); +void op_xba(); +void op_mvn(); +void op_mvp(); +void op_brk(); +void op_cop(); +void op_stp(); +void op_wai(); +void op_xce(); +void op_clc(); +void op_cld(); +void op_cli(); +void op_clv(); +void op_sec(); +void op_sed(); +void op_sei(); +void op_rep(); +void op_sep(); +void op_tax(); +void op_tay(); +void op_txa(); +void op_txy(); +void op_tya(); +void op_tyx(); +void op_tcd(); +void op_tcs(); +void op_tdc(); +void op_tsc(); +void op_tsx(); +void op_txs(); +void op_pha(); +void op_phx(); +void op_phy(); +void op_phd(); +void op_phb(); +void op_phk(); +void op_php(); +void op_pla(); +void op_plx(); +void op_ply(); +void op_pld(); +void op_plb(); +void op_plp(); +void op_pea(); +void op_pei(); +void op_per(); diff --git a/src/cpu/scpu/core/op_misc.b b/src/cpu/scpu/core/op_misc.b index e6f6b3ab..ab96bff9 100644 --- a/src/cpu/scpu/core/op_misc.b +++ b/src/cpu/scpu/core/op_misc.b @@ -62,14 +62,14 @@ stp(0xdb) { } wai(0xcb) { -1:op_io(); - event.wai = true; -2:last_cycle(); - op_io(); -3:while(event.wai) { +//last_cycle() will set event.wai to false +//once an NMI / IRQ edge is reached +1:event.wai = true; + while(event.wai) { last_cycle(); op_io(); } +2:op_io(); } xce(0xfb) { diff --git a/src/cpu/scpu/core/op_misc.cpp b/src/cpu/scpu/core/op_misc.cpp index e96bd0c9..05440942 100644 --- a/src/cpu/scpu/core/op_misc.cpp +++ b/src/cpu/scpu/core/op_misc.cpp @@ -1,17 +1,14 @@ -//nop -case 0xea: { +void sCPU::op_nop() { last_cycle(); op_io(); -} break; +} -//wdm -case 0x42: { +void sCPU::op_wdm() { last_cycle(); op_readpc(); -} break; +} -//xba -case 0xeb: { +void sCPU::op_xba() { op_io(); last_cycle(); op_io(); @@ -20,10 +17,9 @@ case 0xeb: { regs.a.l ^= regs.a.h; regs.p.n = !!(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); -} break; +} -//mvn -case 0x54: { +void sCPU::op_mvn() { dp = op_readpc(); sp = op_readpc(); regs.db = dp; @@ -40,10 +36,9 @@ case 0x54: { last_cycle(); op_io(); if(regs.a.w--)regs.pc.w -= 3; -} break; +} -//mvp -case 0x44: { +void sCPU::op_mvp() { dp = op_readpc(); sp = op_readpc(); regs.db = dp; @@ -60,10 +55,9 @@ case 0x44: { last_cycle(); op_io(); if(regs.a.w--)regs.pc.w -= 3; -} break; +} -//brk -case 0x00: { +void sCPU::op_brk() { op_readpc(); if(!regs.e)op_writestack(regs.pc.b); op_writestack(regs.pc.h); @@ -76,10 +70,9 @@ case 0x00: { last_cycle(); rd.h = op_readlong((regs.e) ? 0xffff : 0xffe7); regs.pc.w = rd.w; -} break; +} -//cop -case 0x02: { +void sCPU::op_cop() { op_readpc(); if(!regs.e)op_writestack(regs.pc.b); op_writestack(regs.pc.h); @@ -92,29 +85,26 @@ case 0x02: { last_cycle(); rd.h = op_readlong((regs.e) ? 0xfff5 : 0xffe5); regs.pc.w = rd.w; -} break; +} -//stp -case 0xdb: { +void sCPU::op_stp() { op_io(); last_cycle(); while(1) { op_io(); } -} break; +} -//wai -case 0xcb: { - op_io(); +void sCPU::op_wai() { + //last_cycle() will set event.wai to false +//once an NMI / IRQ edge is reached event.wai = true; - last_cycle(); - op_io(); while(event.wai) { last_cycle(); op_io(); } -} break; + op_io(); +} -//xce -case 0xfb: { +void sCPU::op_xce() { last_cycle(); op_io(); bool carry = regs.p.c; @@ -128,59 +118,51 @@ bool carry = regs.p.c; regs.x.h = 0x00; regs.y.h = 0x00; } -} break; +} -//clc -case 0x18: { +void sCPU::op_clc() { last_cycle(); op_io(); regs.p.c = 0; -} break; +} -//cld -case 0xd8: { +void sCPU::op_cld() { last_cycle(); op_io(); regs.p.d = 0; -} break; +} -//cli -case 0x58: { +void sCPU::op_cli() { last_cycle(); op_io(); regs.p.i = 0; -} break; +} -//clv -case 0xb8: { +void sCPU::op_clv() { last_cycle(); op_io(); regs.p.v = 0; -} break; +} -//sec -case 0x38: { +void sCPU::op_sec() { last_cycle(); op_io(); regs.p.c = 1; -} break; +} -//sed -case 0xf8: { +void sCPU::op_sed() { last_cycle(); op_io(); regs.p.d = 1; -} break; +} -//sei -case 0x78: { +void sCPU::op_sei() { last_cycle(); op_io(); regs.p.i = 1; -} break; +} -//rep -case 0xc2: { +void sCPU::op_rep() { rd.l = op_readpc(); last_cycle(); op_io(); @@ -190,10 +172,9 @@ case 0xc2: { regs.x.h = 0x00; regs.y.h = 0x00; } -} break; +} -//sep -case 0xe2: { +void sCPU::op_sep() { rd.l = op_readpc(); last_cycle(); op_io(); @@ -203,10 +184,9 @@ case 0xe2: { regs.x.h = 0x00; regs.y.h = 0x00; } -} break; +} -//tax -case 0xaa: { +void sCPU::op_tax() { last_cycle(); op_io(); if(regs.p.x) { @@ -218,10 +198,9 @@ case 0xaa: { regs.p.n = !!(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } -} break; +} -//tay -case 0xa8: { +void sCPU::op_tay() { last_cycle(); op_io(); if(regs.p.x) { @@ -233,10 +212,9 @@ case 0xa8: { regs.p.n = !!(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } -} break; +} -//txa -case 0x8a: { +void sCPU::op_txa() { last_cycle(); op_io(); if(regs.p.m) { @@ -248,10 +226,9 @@ case 0x8a: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//txy -case 0x9b: { +void sCPU::op_txy() { last_cycle(); op_io(); if(regs.p.x) { @@ -263,10 +240,9 @@ case 0x9b: { regs.p.n = !!(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } -} break; +} -//tya -case 0x98: { +void sCPU::op_tya() { last_cycle(); op_io(); if(regs.p.m) { @@ -278,10 +254,9 @@ case 0x98: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//tyx -case 0xbb: { +void sCPU::op_tyx() { last_cycle(); op_io(); if(regs.p.x) { @@ -293,36 +268,32 @@ case 0xbb: { regs.p.n = !!(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } -} break; +} -//tcd -case 0x5b: { +void sCPU::op_tcd() { last_cycle(); op_io(); regs.d.w = regs.a.w; regs.p.n = !!(regs.d.w & 0x8000); regs.p.z = (regs.d.w == 0); -} break; +} -//tcs -case 0x1b: { +void sCPU::op_tcs() { last_cycle(); op_io(); regs.s.w = regs.a.w; if(regs.e)regs.s.h = 0x01; -} break; +} -//tdc -case 0x7b: { +void sCPU::op_tdc() { last_cycle(); op_io(); regs.a.w = regs.d.w; regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); -} break; +} -//tsc -case 0x3b: { +void sCPU::op_tsc() { last_cycle(); op_io(); regs.a.w = regs.s.w; @@ -333,10 +304,9 @@ case 0x3b: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//tsx -case 0xba: { +void sCPU::op_tsx() { last_cycle(); op_io(); if(regs.p.x) { @@ -348,10 +318,9 @@ case 0xba: { regs.p.n = !!(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } -} break; +} -//txs -case 0x9a: { +void sCPU::op_txs() { last_cycle(); op_io(); if(regs.e) { @@ -359,64 +328,56 @@ case 0x9a: { } else { regs.s.w = regs.x.w; } -} break; +} -//pha -case 0x48: { +void sCPU::op_pha() { op_io(); if(!regs.p.m)op_writestack(regs.a.h); last_cycle(); op_writestack(regs.a.l); -} break; +} -//phx -case 0xda: { +void sCPU::op_phx() { op_io(); if(!regs.p.x)op_writestack(regs.x.h); last_cycle(); op_writestack(regs.x.l); -} break; +} -//phy -case 0x5a: { +void sCPU::op_phy() { op_io(); if(!regs.p.x)op_writestack(regs.y.h); last_cycle(); op_writestack(regs.y.l); -} break; +} -//phd -case 0x0b: { +void sCPU::op_phd() { op_io(); op_writestackn(regs.d.h); last_cycle(); op_writestackn(regs.d.l); if(regs.e)regs.s.h = 0x01; -} break; +} -//phb -case 0x8b: { +void sCPU::op_phb() { op_io(); last_cycle(); op_writestack(regs.db); -} break; +} -//phk -case 0x4b: { +void sCPU::op_phk() { op_io(); last_cycle(); op_writestack(regs.pc.b); -} break; +} -//php -case 0x08: { +void sCPU::op_php() { op_io(); last_cycle(); op_writestack(regs.p); -} break; +} -//pla -case 0x68: { +void sCPU::op_pla() { op_io(); op_io(); if(regs.p.m)last_cycle(); @@ -424,16 +385,15 @@ case 0x68: { if(regs.p.m) { regs.p.n = !!(regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); - break; + return; } last_cycle(); regs.a.h = op_readstack(); regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); -} break; +} -//plx -case 0xfa: { +void sCPU::op_plx() { op_io(); op_io(); if(regs.p.x)last_cycle(); @@ -441,16 +401,15 @@ case 0xfa: { if(regs.p.x) { regs.p.n = !!(regs.x.l & 0x80); regs.p.z = (regs.x.l == 0); - break; + return; } last_cycle(); regs.x.h = op_readstack(); regs.p.n = !!(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); -} break; +} -//ply -case 0x7a: { +void sCPU::op_ply() { op_io(); op_io(); if(regs.p.x)last_cycle(); @@ -458,16 +417,15 @@ case 0x7a: { if(regs.p.x) { regs.p.n = !!(regs.y.l & 0x80); regs.p.z = (regs.y.l == 0); - break; + return; } last_cycle(); regs.y.h = op_readstack(); regs.p.n = !!(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); -} break; +} -//pld -case 0x2b: { +void sCPU::op_pld() { op_io(); op_io(); regs.d.l = op_readstackn(); @@ -476,20 +434,18 @@ case 0x2b: { regs.p.n = !!(regs.d.w & 0x8000); regs.p.z = (regs.d.w == 0); if(regs.e)regs.s.h = 0x01; -} break; +} -//plb -case 0xab: { +void sCPU::op_plb() { op_io(); op_io(); last_cycle(); regs.db = op_readstack(); regs.p.n = !!(regs.db & 0x80); regs.p.z = (regs.db == 0); -} break; +} -//plp -case 0x28: { +void sCPU::op_plp() { op_io(); op_io(); last_cycle(); @@ -499,20 +455,18 @@ case 0x28: { regs.x.h = 0x00; regs.y.h = 0x00; } -} break; +} -//pea -case 0xf4: { +void sCPU::op_pea() { aa.l = op_readpc(); aa.h = op_readpc(); op_writestackn(aa.h); last_cycle(); op_writestackn(aa.l); if(regs.e)regs.s.h = 0x01; -} break; +} -//pei -case 0xd4: { +void sCPU::op_pei() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -521,10 +475,9 @@ case 0xd4: { last_cycle(); op_writestackn(aa.l); if(regs.e)regs.s.h = 0x01; -} break; +} -//per -case 0x62: { +void sCPU::op_per() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -533,5 +486,5 @@ case 0x62: { last_cycle(); op_writestackn(rd.l); if(regs.e)regs.s.h = 0x01; -} break; +} diff --git a/src/cpu/scpu/core/op_pc.cpp b/src/cpu/scpu/core/op_pc.cpp index 9f61ba83..16f174a6 100644 --- a/src/cpu/scpu/core/op_pc.cpp +++ b/src/cpu/scpu/core/op_pc.cpp @@ -1,171 +1,157 @@ -//bcc -case 0x90: { +void sCPU::op_bcc() { if(!!regs.p.c)last_cycle(); rd.l = op_readpc(); if(!regs.p.c) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//bcs -case 0xb0: { +void sCPU::op_bcs() { if(!regs.p.c)last_cycle(); rd.l = op_readpc(); if(regs.p.c) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//bne -case 0xd0: { +void sCPU::op_bne() { if(!!regs.p.z)last_cycle(); rd.l = op_readpc(); if(!regs.p.z) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//beq -case 0xf0: { +void sCPU::op_beq() { if(!regs.p.z)last_cycle(); rd.l = op_readpc(); if(regs.p.z) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//bpl -case 0x10: { +void sCPU::op_bpl() { if(!!regs.p.n)last_cycle(); rd.l = op_readpc(); if(!regs.p.n) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//bmi -case 0x30: { +void sCPU::op_bmi() { if(!regs.p.n)last_cycle(); rd.l = op_readpc(); if(regs.p.n) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//bvc -case 0x50: { +void sCPU::op_bvc() { if(!!regs.p.v)last_cycle(); rd.l = op_readpc(); if(!regs.p.v) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//bvs -case 0x70: { +void sCPU::op_bvs() { if(!regs.p.v)last_cycle(); rd.l = op_readpc(); if(regs.p.v) { aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; } else { - break; + return; } op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//bra -case 0x80: { +void sCPU::op_bra() { rd.l = op_readpc(); aa.w = regs.pc.d + (int8)rd.l; regs.pc.w = aa.w; op_io_cond6(aa.w); last_cycle(); op_io(); -} break; +} -//brl -case 0x82: { +void sCPU::op_brl() { rd.l = op_readpc(); rd.h = op_readpc(); last_cycle(); op_io(); regs.pc.w = regs.pc.d + (int16)rd.w; -} break; +} -//jmp_addr -case 0x4c: { +void sCPU::op_jmp_addr() { rd.l = op_readpc(); last_cycle(); rd.h = op_readpc(); regs.pc.w = rd.w; -} break; +} -//jmp_long -case 0x5c: { +void sCPU::op_jmp_long() { rd.l = op_readpc(); rd.h = op_readpc(); last_cycle(); rd.b = op_readpc(); regs.pc.d = rd.d & 0xffffff; -} break; +} -//jmp_iaddr -case 0x6c: { +void sCPU::op_jmp_iaddr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readaddr(aa.w); last_cycle(); rd.h = op_readaddr(aa.w + 1); regs.pc.w = rd.w; -} break; +} -//jmp_iaddrx -case 0x7c: { +void sCPU::op_jmp_iaddrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -173,10 +159,9 @@ case 0x7c: { last_cycle(); rd.h = op_readpbr(aa.w + regs.x.w + 1); regs.pc.w = rd.w; -} break; +} -//jmp_iladdr -case 0xdc: { +void sCPU::op_jmp_iladdr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readaddr(aa.w); @@ -184,10 +169,9 @@ case 0xdc: { last_cycle(); rd.b = op_readaddr(aa.w + 2); regs.pc.d = rd.d & 0xffffff; -} break; +} -//jsr_addr -case 0x20: { +void sCPU::op_jsr_addr() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -196,10 +180,9 @@ case 0x20: { last_cycle(); op_writestack(regs.pc.l); regs.pc.w = aa.w; -} break; +} -//jsr_long -case 0x22: { +void sCPU::op_jsr_long() { aa.l = op_readpc(); aa.h = op_readpc(); op_writestackn(regs.pc.b); @@ -211,10 +194,9 @@ case 0x22: { op_writestackn(regs.pc.l); regs.pc.d = aa.d & 0xffffff; if(regs.e)regs.s.h = 0x01; -} break; +} -//jsr_iaddrx -case 0xfc: { +void sCPU::op_jsr_iaddrx() { aa.l = op_readpc(); op_writestackn(regs.pc.h); op_writestackn(regs.pc.l); @@ -225,10 +207,9 @@ case 0xfc: { rd.h = op_readpbr(aa.w + regs.x.w + 1); regs.pc.w = rd.w; if(regs.e)regs.s.h = 0x01; -} break; +} -//rti -case 0x40: { +void sCPU::op_rti() { op_io(); op_io(); regs.p = op_readstack(); @@ -242,15 +223,14 @@ case 0x40: { rd.h = op_readstack(); if(regs.e) { regs.pc.w = rd.w; - break; + return; } last_cycle(); rd.b = op_readstack(); regs.pc.d = rd.d & 0xffffff; -} break; +} -//rts -case 0x60: { +void sCPU::op_rts() { op_io(); op_io(); rd.l = op_readstack(); @@ -259,10 +239,9 @@ case 0x60: { op_io(); regs.pc.w = rd.w; regs.pc.w++; -} break; +} -//rtl -case 0x6b: { +void sCPU::op_rtl() { op_io(); op_io(); rd.l = op_readstackn(); @@ -272,5 +251,5 @@ case 0x6b: { regs.pc.d = rd.d & 0xffffff; regs.pc.w++; if(regs.e)regs.s.h = 0x01; -} break; +} diff --git a/src/cpu/scpu/core/op_read.cpp b/src/cpu/scpu/core/op_read.cpp index fee2eda8..7eeb756c 100644 --- a/src/cpu/scpu/core/op_read.cpp +++ b/src/cpu/scpu/core/op_read.cpp @@ -1,1034 +1,950 @@ -//adc_const -case 0x69: { +void sCPU::op_adc_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readpc(); op_adc_w(); -} break; +} -//and_const -case 0x29: { +void sCPU::op_and_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readpc(); op_and_w(); -} break; +} -//cmp_const -case 0xc9: { +void sCPU::op_cmp_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readpc(); op_cmp_w(); -} break; +} -//cpx_const -case 0xe0: { +void sCPU::op_cpx_const() { if(regs.p.x)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_cpx_b(); break; } + if(regs.p.x) { op_cpx_b(); return; } last_cycle(); rd.h = op_readpc(); op_cpx_w(); -} break; +} -//cpy_const -case 0xc0: { +void sCPU::op_cpy_const() { if(regs.p.x)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_cpy_b(); break; } + if(regs.p.x) { op_cpy_b(); return; } last_cycle(); rd.h = op_readpc(); op_cpy_w(); -} break; +} -//eor_const -case 0x49: { +void sCPU::op_eor_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readpc(); op_eor_w(); -} break; +} -//lda_const -case 0xa9: { +void sCPU::op_lda_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readpc(); op_lda_w(); -} break; +} -//ldx_const -case 0xa2: { +void sCPU::op_ldx_const() { if(regs.p.x)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.p.x) { op_ldx_b(); return; } last_cycle(); rd.h = op_readpc(); op_ldx_w(); -} break; +} -//ldy_const -case 0xa0: { +void sCPU::op_ldy_const() { if(regs.p.x)last_cycle(); rd.l = op_readpc(); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.p.x) { op_ldy_b(); return; } last_cycle(); rd.h = op_readpc(); op_ldy_w(); -} break; +} -//ora_const -case 0x09: { +void sCPU::op_ora_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readpc(); op_ora_w(); -} break; +} -//sbc_const -case 0xe9: { +void sCPU::op_sbc_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readpc(); op_sbc_w(); -} break; +} -//adc_addr -case 0x6d: { +void sCPU::op_adc_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_adc_w(); -} break; +} -//and_addr -case 0x2d: { +void sCPU::op_and_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_and_w(); -} break; +} -//bit_addr -case 0x2c: { +void sCPU::op_bit_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_bit_b(); break; } + if(regs.p.m) { op_bit_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_bit_w(); -} break; +} -//cmp_addr -case 0xcd: { +void sCPU::op_cmp_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cmp_w(); -} break; +} -//cpx_addr -case 0xec: { +void sCPU::op_cpx_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.x)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_cpx_b(); break; } + if(regs.p.x) { op_cpx_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cpx_w(); -} break; +} -//cpy_addr -case 0xcc: { +void sCPU::op_cpy_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.x)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_cpy_b(); break; } + if(regs.p.x) { op_cpy_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cpy_w(); -} break; +} -//eor_addr -case 0x4d: { +void sCPU::op_eor_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_eor_w(); -} break; +} -//lda_addr -case 0xad: { +void sCPU::op_lda_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_lda_w(); -} break; +} -//ldx_addr -case 0xae: { +void sCPU::op_ldx_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.x)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.p.x) { op_ldx_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ldx_w(); -} break; +} -//ldy_addr -case 0xac: { +void sCPU::op_ldy_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.x)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.p.x) { op_ldy_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ldy_w(); -} break; +} -//ora_addr -case 0x0d: { +void sCPU::op_ora_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ora_w(); -} break; +} -//sbc_addr -case 0xed: { +void sCPU::op_sbc_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_sbc_w(); -} break; +} -//adc_addrx -case 0x7d: { +void sCPU::op_adc_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_adc_w(); -} break; +} -//and_addrx -case 0x3d: { +void sCPU::op_and_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_and_w(); -} break; +} -//bit_addrx -case 0x3c: { +void sCPU::op_bit_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_bit_b(); break; } + if(regs.p.m) { op_bit_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_bit_w(); -} break; +} -//cmp_addrx -case 0xdd: { +void sCPU::op_cmp_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_cmp_w(); -} break; +} -//eor_addrx -case 0x5d: { +void sCPU::op_eor_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_eor_w(); -} break; +} -//lda_addrx -case 0xbd: { +void sCPU::op_lda_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_lda_w(); -} break; +} -//ldy_addrx -case 0xbc: { +void sCPU::op_ldy_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.x)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.p.x) { op_ldy_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_ldy_w(); -} break; +} -//ora_addrx -case 0x1d: { +void sCPU::op_ora_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_ora_w(); -} break; +} -//sbc_addrx -case 0xfd: { +void sCPU::op_sbc_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.x.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_sbc_w(); -} break; +} -//adc_addry -case 0x79: { +void sCPU::op_adc_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); -} break; +} -//and_addry -case 0x39: { +void sCPU::op_and_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); -} break; +} -//cmp_addry -case 0xd9: { +void sCPU::op_cmp_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); -} break; +} -//eor_addry -case 0x59: { +void sCPU::op_eor_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); -} break; +} -//lda_addry -case 0xb9: { +void sCPU::op_lda_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); -} break; +} -//ldx_addry -case 0xbe: { +void sCPU::op_ldx_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.x)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.p.x) { op_ldx_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ldx_w(); -} break; +} -//ora_addry -case 0x19: { +void sCPU::op_ora_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); -} break; +} -//sbc_addry -case 0xf9: { +void sCPU::op_sbc_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); -} break; +} -//adc_long -case 0x6f: { +void sCPU::op_adc_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_adc_w(); -} break; +} -//and_long -case 0x2f: { +void sCPU::op_and_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_and_w(); -} break; +} -//cmp_long -case 0xcf: { +void sCPU::op_cmp_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_cmp_w(); -} break; +} -//eor_long -case 0x4f: { +void sCPU::op_eor_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_eor_w(); -} break; +} -//lda_long -case 0xaf: { +void sCPU::op_lda_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_lda_w(); -} break; +} -//ora_long -case 0x0f: { +void sCPU::op_ora_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_ora_w(); -} break; +} -//sbc_long -case 0xef: { +void sCPU::op_sbc_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_sbc_w(); -} break; +} -//adc_longx -case 0x7f: { +void sCPU::op_adc_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_adc_w(); -} break; +} -//and_longx -case 0x3f: { +void sCPU::op_and_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_and_w(); -} break; +} -//cmp_longx -case 0xdf: { +void sCPU::op_cmp_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_cmp_w(); -} break; +} -//eor_longx -case 0x5f: { +void sCPU::op_eor_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_eor_w(); -} break; +} -//lda_longx -case 0xbf: { +void sCPU::op_lda_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_lda_w(); -} break; +} -//ora_longx -case 0x1f: { +void sCPU::op_ora_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_ora_w(); -} break; +} -//sbc_longx -case 0xff: { +void sCPU::op_sbc_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.x.w + 1); op_sbc_w(); -} break; +} -//adc_dp -case 0x65: { +void sCPU::op_adc_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_adc_w(); -} break; +} -//and_dp -case 0x25: { +void sCPU::op_and_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_and_w(); -} break; +} -//bit_dp -case 0x24: { +void sCPU::op_bit_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_bit_b(); break; } + if(regs.p.m) { op_bit_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_bit_w(); -} break; +} -//cmp_dp -case 0xc5: { +void sCPU::op_cmp_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_cmp_w(); -} break; +} -//cpx_dp -case 0xe4: { +void sCPU::op_cpx_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.x)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_cpx_b(); break; } + if(regs.p.x) { op_cpx_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_cpx_w(); -} break; +} -//cpy_dp -case 0xc4: { +void sCPU::op_cpy_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.x)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_cpy_b(); break; } + if(regs.p.x) { op_cpy_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_cpy_w(); -} break; +} -//eor_dp -case 0x45: { +void sCPU::op_eor_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_eor_w(); -} break; +} -//lda_dp -case 0xa5: { +void sCPU::op_lda_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_lda_w(); -} break; +} -//ldx_dp -case 0xa6: { +void sCPU::op_ldx_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.x)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.p.x) { op_ldx_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_ldx_w(); -} break; +} -//ldy_dp -case 0xa4: { +void sCPU::op_ldy_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.x)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.p.x) { op_ldy_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_ldy_w(); -} break; +} -//ora_dp -case 0x05: { +void sCPU::op_ora_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_ora_w(); -} break; +} -//sbc_dp -case 0xe5: { +void sCPU::op_sbc_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdp(dp + 1); op_sbc_w(); -} break; +} -//adc_dpx -case 0x75: { +void sCPU::op_adc_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_adc_w(); -} break; +} -//and_dpx -case 0x35: { +void sCPU::op_and_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_and_w(); -} break; +} -//bit_dpx -case 0x34: { +void sCPU::op_bit_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_bit_b(); break; } + if(regs.p.m) { op_bit_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_bit_w(); -} break; +} -//cmp_dpx -case 0xd5: { +void sCPU::op_cmp_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_cmp_w(); -} break; +} -//eor_dpx -case 0x55: { +void sCPU::op_eor_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_eor_w(); -} break; +} -//lda_dpx -case 0xb5: { +void sCPU::op_lda_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_lda_w(); -} break; +} -//ldy_dpx -case 0xb4: { +void sCPU::op_ldy_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.x)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.x) { op_ldy_b(); break; } + if(regs.p.x) { op_ldy_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_ldy_w(); -} break; +} -//ora_dpx -case 0x15: { +void sCPU::op_ora_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_ora_w(); -} break; +} -//sbc_dpx -case 0xf5: { +void sCPU::op_sbc_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.x.w + 1); op_sbc_w(); -} break; +} -//ldx_dpy -case 0xb6: { +void sCPU::op_ldx_dpy() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.x)last_cycle(); rd.l = op_readdp(dp + regs.y.w); - if(regs.p.x) { op_ldx_b(); break; } + if(regs.p.x) { op_ldx_b(); return; } last_cycle(); rd.h = op_readdp(dp + regs.y.w + 1); op_ldx_w(); -} break; +} -//adc_idp -case 0x72: { +void sCPU::op_adc_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_adc_w(); -} break; +} -//and_idp -case 0x32: { +void sCPU::op_and_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_and_w(); -} break; +} -//cmp_idp -case 0xd2: { +void sCPU::op_cmp_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cmp_w(); -} break; +} -//eor_idp -case 0x52: { +void sCPU::op_eor_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_eor_w(); -} break; +} -//lda_idp -case 0xb2: { +void sCPU::op_lda_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_lda_w(); -} break; +} -//ora_idp -case 0x12: { +void sCPU::op_ora_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ora_w(); -} break; +} -//sbc_idp -case 0xf2: { +void sCPU::op_sbc_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_sbc_w(); -} break; +} -//adc_idpx -case 0x61: { +void sCPU::op_adc_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -1036,14 +952,13 @@ case 0x61: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_adc_w(); -} break; +} -//and_idpx -case 0x21: { +void sCPU::op_and_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -1051,14 +966,13 @@ case 0x21: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_and_w(); -} break; +} -//cmp_idpx -case 0xc1: { +void sCPU::op_cmp_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -1066,14 +980,13 @@ case 0xc1: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_cmp_w(); -} break; +} -//eor_idpx -case 0x41: { +void sCPU::op_eor_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -1081,14 +994,13 @@ case 0x41: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_eor_w(); -} break; +} -//lda_idpx -case 0xa1: { +void sCPU::op_lda_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -1096,14 +1008,13 @@ case 0xa1: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_lda_w(); -} break; +} -//ora_idpx -case 0x01: { +void sCPU::op_ora_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -1111,14 +1022,13 @@ case 0x01: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_ora_w(); -} break; +} -//sbc_idpx -case 0xe1: { +void sCPU::op_sbc_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -1126,14 +1036,13 @@ case 0xe1: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + 1); op_sbc_w(); -} break; +} -//adc_idpy -case 0x71: { +void sCPU::op_adc_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1141,14 +1050,13 @@ case 0x71: { op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); -} break; +} -//and_idpy -case 0x31: { +void sCPU::op_and_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1156,14 +1064,13 @@ case 0x31: { op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); -} break; +} -//cmp_idpy -case 0xd1: { +void sCPU::op_cmp_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1171,14 +1078,13 @@ case 0xd1: { op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); -} break; +} -//eor_idpy -case 0x51: { +void sCPU::op_eor_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1186,14 +1092,13 @@ case 0x51: { op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); -} break; +} -//lda_idpy -case 0xb1: { +void sCPU::op_lda_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1201,14 +1106,13 @@ case 0xb1: { op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); -} break; +} -//ora_idpy -case 0x11: { +void sCPU::op_ora_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1216,14 +1120,13 @@ case 0x11: { op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); -} break; +} -//sbc_idpy -case 0xf1: { +void sCPU::op_sbc_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1231,14 +1134,13 @@ case 0xf1: { op_io_cond4(aa.w, aa.w + regs.y.w); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); -} break; +} -//adc_ildp -case 0x67: { +void sCPU::op_adc_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1246,14 +1148,13 @@ case 0x67: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_adc_w(); -} break; +} -//and_ildp -case 0x27: { +void sCPU::op_and_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1261,14 +1162,13 @@ case 0x27: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_and_w(); -} break; +} -//cmp_ildp -case 0xc7: { +void sCPU::op_cmp_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1276,14 +1176,13 @@ case 0xc7: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_cmp_w(); -} break; +} -//eor_ildp -case 0x47: { +void sCPU::op_eor_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1291,14 +1190,13 @@ case 0x47: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_eor_w(); -} break; +} -//lda_ildp -case 0xa7: { +void sCPU::op_lda_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1306,14 +1204,13 @@ case 0xa7: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_lda_w(); -} break; +} -//ora_ildp -case 0x07: { +void sCPU::op_ora_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1321,14 +1218,13 @@ case 0x07: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_ora_w(); -} break; +} -//sbc_ildp -case 0xe7: { +void sCPU::op_sbc_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1336,14 +1232,13 @@ case 0xe7: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + 1); op_sbc_w(); -} break; +} -//adc_ildpy -case 0x77: { +void sCPU::op_adc_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1351,14 +1246,13 @@ case 0x77: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_adc_w(); -} break; +} -//and_ildpy -case 0x37: { +void sCPU::op_and_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1366,14 +1260,13 @@ case 0x37: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_and_w(); -} break; +} -//cmp_ildpy -case 0xd7: { +void sCPU::op_cmp_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1381,14 +1274,13 @@ case 0xd7: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_cmp_w(); -} break; +} -//eor_ildpy -case 0x57: { +void sCPU::op_eor_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1396,14 +1288,13 @@ case 0x57: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_eor_w(); -} break; +} -//lda_ildpy -case 0xb7: { +void sCPU::op_lda_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1411,14 +1302,13 @@ case 0xb7: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_lda_w(); -} break; +} -//ora_ildpy -case 0x17: { +void sCPU::op_ora_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1426,14 +1316,13 @@ case 0x17: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_ora_w(); -} break; +} -//sbc_ildpy -case 0xf7: { +void sCPU::op_sbc_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -1441,98 +1330,90 @@ case 0xf7: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readlong(aa.d + regs.y.w + 1); op_sbc_w(); -} break; +} -//adc_sr -case 0x63: { +void sCPU::op_adc_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readsp(sp + 1); op_adc_w(); -} break; +} -//and_sr -case 0x23: { +void sCPU::op_and_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readsp(sp + 1); op_and_w(); -} break; +} -//cmp_sr -case 0xc3: { +void sCPU::op_cmp_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readsp(sp + 1); op_cmp_w(); -} break; +} -//eor_sr -case 0x43: { +void sCPU::op_eor_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readsp(sp + 1); op_eor_w(); -} break; +} -//lda_sr -case 0xa3: { +void sCPU::op_lda_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readsp(sp + 1); op_lda_w(); -} break; +} -//ora_sr -case 0x03: { +void sCPU::op_ora_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readsp(sp + 1); op_ora_w(); -} break; +} -//sbc_sr -case 0xe3: { +void sCPU::op_sbc_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); rd.l = op_readsp(sp); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readsp(sp + 1); op_sbc_w(); -} break; +} -//adc_isry -case 0x73: { +void sCPU::op_adc_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -1540,14 +1421,13 @@ case 0x73: { op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } + if(regs.p.m) { op_adc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_adc_w(); -} break; +} -//and_isry -case 0x33: { +void sCPU::op_and_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -1555,14 +1435,13 @@ case 0x33: { op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } + if(regs.p.m) { op_and_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_and_w(); -} break; +} -//cmp_isry -case 0xd3: { +void sCPU::op_cmp_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -1570,14 +1449,13 @@ case 0xd3: { op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } + if(regs.p.m) { op_cmp_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_cmp_w(); -} break; +} -//eor_isry -case 0x53: { +void sCPU::op_eor_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -1585,14 +1463,13 @@ case 0x53: { op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } + if(regs.p.m) { op_eor_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_eor_w(); -} break; +} -//lda_isry -case 0xb3: { +void sCPU::op_lda_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -1600,14 +1477,13 @@ case 0xb3: { op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } + if(regs.p.m) { op_lda_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_lda_w(); -} break; +} -//ora_isry -case 0x13: { +void sCPU::op_ora_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -1615,14 +1491,13 @@ case 0x13: { op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } + if(regs.p.m) { op_ora_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_ora_w(); -} break; +} -//sbc_isry -case 0xf3: { +void sCPU::op_sbc_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -1630,22 +1505,21 @@ case 0xf3: { op_io(); if(regs.p.m)last_cycle(); rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } + if(regs.p.m) { op_sbc_b(); return; } last_cycle(); rd.h = op_readdbr(aa.w + regs.y.w + 1); op_sbc_w(); -} break; +} -//bit_const -case 0x89: { +void sCPU::op_bit_const() { if(regs.p.m)last_cycle(); rd.l = op_readpc(); if(regs.p.m) { regs.p.z = ((rd.l & regs.a.l) == 0); - break; + return; } last_cycle(); rd.h = op_readpc(); regs.p.z = ((rd.w & regs.a.w) == 0); -} break; +} diff --git a/src/cpu/scpu/core/op_rmw.cpp b/src/cpu/scpu/core/op_rmw.cpp index 7924a1ab..2a83066a 100644 --- a/src/cpu/scpu/core/op_rmw.cpp +++ b/src/cpu/scpu/core/op_rmw.cpp @@ -1,5 +1,4 @@ -//inc -case 0x1a: { +void sCPU::op_inc() { last_cycle(); op_io(); if(regs.p.m) { @@ -11,10 +10,9 @@ case 0x1a: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//inx -case 0xe8: { +void sCPU::op_inx() { last_cycle(); op_io(); if(regs.p.x) { @@ -26,10 +24,9 @@ case 0xe8: { regs.p.n = !!(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } -} break; +} -//iny -case 0xc8: { +void sCPU::op_iny() { last_cycle(); op_io(); if(regs.p.x) { @@ -41,10 +38,9 @@ case 0xc8: { regs.p.n = !!(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } -} break; +} -//dec -case 0x3a: { +void sCPU::op_dec() { last_cycle(); op_io(); if(regs.p.m) { @@ -56,10 +52,9 @@ case 0x3a: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//dex -case 0xca: { +void sCPU::op_dex() { last_cycle(); op_io(); if(regs.p.x) { @@ -71,10 +66,9 @@ case 0xca: { regs.p.n = !!(regs.x.w & 0x8000); regs.p.z = (regs.x.w == 0); } -} break; +} -//dey -case 0x88: { +void sCPU::op_dey() { last_cycle(); op_io(); if(regs.p.x) { @@ -86,10 +80,9 @@ case 0x88: { regs.p.n = !!(regs.y.w & 0x8000); regs.p.z = (regs.y.w == 0); } -} break; +} -//asl -case 0x0a: { +void sCPU::op_asl() { last_cycle(); op_io(); if(regs.p.m) { @@ -103,10 +96,9 @@ case 0x0a: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//lsr -case 0x4a: { +void sCPU::op_lsr() { last_cycle(); op_io(); if(regs.p.m) { @@ -120,10 +112,9 @@ case 0x4a: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//rol -case 0x2a: { +void sCPU::op_rol() { last_cycle(); op_io(); uint16 c = regs.p.c; @@ -140,10 +131,9 @@ case 0x2a: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//ror -case 0x6a: { +void sCPU::op_ror() { last_cycle(); op_io(); uint16 c; @@ -162,10 +152,9 @@ case 0x6a: { regs.p.n = !!(regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } -} break; +} -//inc_addr -case 0xee: { +void sCPU::op_inc_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -176,10 +165,9 @@ case 0xee: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//dec_addr -case 0xce: { +void sCPU::op_dec_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -190,10 +178,9 @@ case 0xce: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//asl_addr -case 0x0e: { +void sCPU::op_asl_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -204,10 +191,9 @@ case 0x0e: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//lsr_addr -case 0x4e: { +void sCPU::op_lsr_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -218,10 +204,9 @@ case 0x4e: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//rol_addr -case 0x2e: { +void sCPU::op_rol_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -232,10 +217,9 @@ case 0x2e: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//ror_addr -case 0x6e: { +void sCPU::op_ror_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -246,10 +230,9 @@ case 0x6e: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//trb_addr -case 0x1c: { +void sCPU::op_trb_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -260,10 +243,9 @@ case 0x1c: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//tsb_addr -case 0x0c: { +void sCPU::op_tsb_addr() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); @@ -274,10 +256,9 @@ case 0x0c: { op_writedbr(aa.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w, rd.l); -} break; +} -//inc_addrx -case 0xfe: { +void sCPU::op_inc_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -289,10 +270,9 @@ case 0xfe: { op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w + regs.x.w, rd.l); -} break; +} -//dec_addrx -case 0xde: { +void sCPU::op_dec_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -304,10 +284,9 @@ case 0xde: { op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w + regs.x.w, rd.l); -} break; +} -//asl_addrx -case 0x1e: { +void sCPU::op_asl_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -319,10 +298,9 @@ case 0x1e: { op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w + regs.x.w, rd.l); -} break; +} -//lsr_addrx -case 0x5e: { +void sCPU::op_lsr_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -334,10 +312,9 @@ case 0x5e: { op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w + regs.x.w, rd.l); -} break; +} -//rol_addrx -case 0x3e: { +void sCPU::op_rol_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -349,10 +326,9 @@ case 0x3e: { op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w + regs.x.w, rd.l); -} break; +} -//ror_addrx -case 0x7e: { +void sCPU::op_ror_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); @@ -364,10 +340,9 @@ case 0x7e: { op_writedbr(aa.w + regs.x.w + 1, rd.h); } last_cycle(); op_writedbr(aa.w + regs.x.w, rd.l); -} break; +} -//inc_dp -case 0xe6: { +void sCPU::op_inc_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -378,10 +353,9 @@ case 0xe6: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//dec_dp -case 0xc6: { +void sCPU::op_dec_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -392,10 +366,9 @@ case 0xc6: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//asl_dp -case 0x06: { +void sCPU::op_asl_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -406,10 +379,9 @@ case 0x06: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//lsr_dp -case 0x46: { +void sCPU::op_lsr_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -420,10 +392,9 @@ case 0x46: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//rol_dp -case 0x26: { +void sCPU::op_rol_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -434,10 +405,9 @@ case 0x26: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//ror_dp -case 0x66: { +void sCPU::op_ror_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -448,10 +418,9 @@ case 0x66: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//trb_dp -case 0x14: { +void sCPU::op_trb_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -462,10 +431,9 @@ case 0x14: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//tsb_dp -case 0x04: { +void sCPU::op_tsb_dp() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); @@ -476,10 +444,9 @@ case 0x04: { op_writedp(dp + 1, rd.h); } last_cycle(); op_writedp(dp, rd.l); -} break; +} -//inc_dpx -case 0xf6: { +void sCPU::op_inc_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -491,10 +458,9 @@ case 0xf6: { op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); op_writedp(dp + regs.x.w, rd.l); -} break; +} -//dec_dpx -case 0xd6: { +void sCPU::op_dec_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -506,10 +472,9 @@ case 0xd6: { op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); op_writedp(dp + regs.x.w, rd.l); -} break; +} -//asl_dpx -case 0x16: { +void sCPU::op_asl_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -521,10 +486,9 @@ case 0x16: { op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); op_writedp(dp + regs.x.w, rd.l); -} break; +} -//lsr_dpx -case 0x56: { +void sCPU::op_lsr_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -536,10 +500,9 @@ case 0x56: { op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); op_writedp(dp + regs.x.w, rd.l); -} break; +} -//rol_dpx -case 0x36: { +void sCPU::op_rol_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -551,10 +514,9 @@ case 0x36: { op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); op_writedp(dp + regs.x.w, rd.l); -} break; +} -//ror_dpx -case 0x76: { +void sCPU::op_ror_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -566,5 +528,5 @@ case 0x76: { op_writedp(dp + regs.x.w + 1, rd.h); } last_cycle(); op_writedp(dp + regs.x.w, rd.l); -} break; +} diff --git a/src/cpu/scpu/core/op_write.cpp b/src/cpu/scpu/core/op_write.cpp index 97c731f9..c8e1ad10 100644 --- a/src/cpu/scpu/core/op_write.cpp +++ b/src/cpu/scpu/core/op_write.cpp @@ -1,214 +1,195 @@ -//sta_addr -case 0x8d: { +void sCPU::op_sta_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); op_writedbr(aa.w, regs.a.w); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + 1, regs.a.w >> 8); -} break; +} -//stx_addr -case 0x8e: { +void sCPU::op_stx_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.x)last_cycle(); op_writedbr(aa.w, regs.x.w); - if(regs.p.x)break; + if(regs.p.x)return; last_cycle(); op_writedbr(aa.w + 1, regs.x.w >> 8); -} break; +} -//sty_addr -case 0x8c: { +void sCPU::op_sty_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.x)last_cycle(); op_writedbr(aa.w, regs.y.w); - if(regs.p.x)break; + if(regs.p.x)return; last_cycle(); op_writedbr(aa.w + 1, regs.y.w >> 8); -} break; +} -//stz_addr -case 0x9c: { +void sCPU::op_stz_addr() { aa.l = op_readpc(); aa.h = op_readpc(); if(regs.p.m)last_cycle(); op_writedbr(aa.w, 0x0000); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + 1, 0x0000 >> 8); -} break; +} -//sta_addrx -case 0x9d: { +void sCPU::op_sta_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); if(regs.p.m)last_cycle(); op_writedbr(aa.w + regs.x.w, regs.a.w); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + regs.x.w + 1, regs.a.w >> 8); -} break; +} -//stz_addrx -case 0x9e: { +void sCPU::op_stz_addrx() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); if(regs.p.m)last_cycle(); op_writedbr(aa.w + regs.x.w, 0x0000); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + regs.x.w + 1, 0x0000 >> 8); -} break; +} -//sta_addry -case 0x99: { +void sCPU::op_sta_addry() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); if(regs.p.m)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} break; +} -//sta_long -case 0x8f: { +void sCPU::op_sta_long() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); op_writelong(aa.d, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writelong(aa.d + 1, regs.a.h); -} break; +} -//sta_longx -case 0x9f: { +void sCPU::op_sta_longx() { aa.l = op_readpc(); aa.h = op_readpc(); aa.b = op_readpc(); if(regs.p.m)last_cycle(); op_writelong(aa.d + regs.x.w, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writelong(aa.d + regs.x.w + 1, regs.a.h); -} break; +} -//sta_dp -case 0x85: { +void sCPU::op_sta_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); op_writedp(dp, regs.a.w); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedp(dp + 1, regs.a.w >> 8); -} break; +} -//stx_dp -case 0x86: { +void sCPU::op_stx_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.x)last_cycle(); op_writedp(dp, regs.x.w); - if(regs.p.x)break; + if(regs.p.x)return; last_cycle(); op_writedp(dp + 1, regs.x.w >> 8); -} break; +} -//sty_dp -case 0x84: { +void sCPU::op_sty_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.x)last_cycle(); op_writedp(dp, regs.y.w); - if(regs.p.x)break; + if(regs.p.x)return; last_cycle(); op_writedp(dp + 1, regs.y.w >> 8); -} break; +} -//stz_dp -case 0x64: { +void sCPU::op_stz_dp() { dp = op_readpc(); op_io_cond2(); if(regs.p.m)last_cycle(); op_writedp(dp, 0x0000); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedp(dp + 1, 0x0000 >> 8); -} break; +} -//sta_dpx -case 0x95: { +void sCPU::op_sta_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); op_writedp(dp + regs.x.w, regs.a.w); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedp(dp + regs.x.w + 1, regs.a.w >> 8); -} break; +} -//sty_dpx -case 0x94: { +void sCPU::op_sty_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.x)last_cycle(); op_writedp(dp + regs.x.w, regs.y.w); - if(regs.p.x)break; + if(regs.p.x)return; last_cycle(); op_writedp(dp + regs.x.w + 1, regs.y.w >> 8); -} break; +} -//stz_dpx -case 0x74: { +void sCPU::op_stz_dpx() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.m)last_cycle(); op_writedp(dp + regs.x.w, 0x0000); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedp(dp + regs.x.w + 1, 0x0000 >> 8); -} break; +} -//stx_dpy -case 0x96: { +void sCPU::op_stx_dpy() { dp = op_readpc(); op_io_cond2(); op_io(); if(regs.p.x)last_cycle(); op_writedp(dp + regs.y.w, regs.x.l); - if(regs.p.x)break; + if(regs.p.x)return; last_cycle(); op_writedp(dp + regs.y.w + 1, regs.x.h); -} break; +} -//sta_idp -case 0x92: { +void sCPU::op_sta_idp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); aa.h = op_readdp(dp + 1); if(regs.p.m)last_cycle(); op_writedbr(aa.w, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + 1, regs.a.h); -} break; +} -//sta_ildp -case 0x87: { +void sCPU::op_sta_ildp() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -216,13 +197,12 @@ case 0x87: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); op_writelong(aa.d, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writelong(aa.d + 1, regs.a.h); -} break; +} -//sta_idpx -case 0x81: { +void sCPU::op_sta_idpx() { dp = op_readpc(); op_io_cond2(); op_io(); @@ -230,13 +210,12 @@ case 0x81: { aa.h = op_readdp(dp + regs.x.w + 1); if(regs.p.m)last_cycle(); op_writedbr(aa.w, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + 1, regs.a.h); -} break; +} -//sta_idpy -case 0x91: { +void sCPU::op_sta_idpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -244,13 +223,12 @@ case 0x91: { op_io(); if(regs.p.m)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} break; +} -//sta_ildpy -case 0x97: { +void sCPU::op_sta_ildpy() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp); @@ -258,24 +236,22 @@ case 0x97: { aa.b = op_readdp(dp + 2); if(regs.p.m)last_cycle(); op_writelong(aa.d + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writelong(aa.d + regs.y.w + 1, regs.a.h); -} break; +} -//sta_sr -case 0x83: { +void sCPU::op_sta_sr() { sp = op_readpc(); op_io(); if(regs.p.m)last_cycle(); op_writesp(sp, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writesp(sp + 1, regs.a.h); -} break; +} -//sta_isry -case 0x93: { +void sCPU::op_sta_isry() { sp = op_readpc(); op_io(); aa.l = op_readsp(sp); @@ -283,8 +259,8 @@ case 0x93: { op_io(); if(regs.p.m)last_cycle(); op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m)break; + if(regs.p.m)return; last_cycle(); op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} break; +} diff --git a/src/cpu/scpu/core/optable.cpp b/src/cpu/scpu/core/optable.cpp new file mode 100644 index 00000000..88d52dd4 --- /dev/null +++ b/src/cpu/scpu/core/optable.cpp @@ -0,0 +1,256 @@ +optbl[0x69] = &sCPU::op_adc_const; +optbl[0x29] = &sCPU::op_and_const; +optbl[0xc9] = &sCPU::op_cmp_const; +optbl[0xe0] = &sCPU::op_cpx_const; +optbl[0xc0] = &sCPU::op_cpy_const; +optbl[0x49] = &sCPU::op_eor_const; +optbl[0xa9] = &sCPU::op_lda_const; +optbl[0xa2] = &sCPU::op_ldx_const; +optbl[0xa0] = &sCPU::op_ldy_const; +optbl[0x09] = &sCPU::op_ora_const; +optbl[0xe9] = &sCPU::op_sbc_const; +optbl[0x6d] = &sCPU::op_adc_addr; +optbl[0x2d] = &sCPU::op_and_addr; +optbl[0x2c] = &sCPU::op_bit_addr; +optbl[0xcd] = &sCPU::op_cmp_addr; +optbl[0xec] = &sCPU::op_cpx_addr; +optbl[0xcc] = &sCPU::op_cpy_addr; +optbl[0x4d] = &sCPU::op_eor_addr; +optbl[0xad] = &sCPU::op_lda_addr; +optbl[0xae] = &sCPU::op_ldx_addr; +optbl[0xac] = &sCPU::op_ldy_addr; +optbl[0x0d] = &sCPU::op_ora_addr; +optbl[0xed] = &sCPU::op_sbc_addr; +optbl[0x7d] = &sCPU::op_adc_addrx; +optbl[0x3d] = &sCPU::op_and_addrx; +optbl[0x3c] = &sCPU::op_bit_addrx; +optbl[0xdd] = &sCPU::op_cmp_addrx; +optbl[0x5d] = &sCPU::op_eor_addrx; +optbl[0xbd] = &sCPU::op_lda_addrx; +optbl[0xbc] = &sCPU::op_ldy_addrx; +optbl[0x1d] = &sCPU::op_ora_addrx; +optbl[0xfd] = &sCPU::op_sbc_addrx; +optbl[0x79] = &sCPU::op_adc_addry; +optbl[0x39] = &sCPU::op_and_addry; +optbl[0xd9] = &sCPU::op_cmp_addry; +optbl[0x59] = &sCPU::op_eor_addry; +optbl[0xb9] = &sCPU::op_lda_addry; +optbl[0xbe] = &sCPU::op_ldx_addry; +optbl[0x19] = &sCPU::op_ora_addry; +optbl[0xf9] = &sCPU::op_sbc_addry; +optbl[0x6f] = &sCPU::op_adc_long; +optbl[0x2f] = &sCPU::op_and_long; +optbl[0xcf] = &sCPU::op_cmp_long; +optbl[0x4f] = &sCPU::op_eor_long; +optbl[0xaf] = &sCPU::op_lda_long; +optbl[0x0f] = &sCPU::op_ora_long; +optbl[0xef] = &sCPU::op_sbc_long; +optbl[0x7f] = &sCPU::op_adc_longx; +optbl[0x3f] = &sCPU::op_and_longx; +optbl[0xdf] = &sCPU::op_cmp_longx; +optbl[0x5f] = &sCPU::op_eor_longx; +optbl[0xbf] = &sCPU::op_lda_longx; +optbl[0x1f] = &sCPU::op_ora_longx; +optbl[0xff] = &sCPU::op_sbc_longx; +optbl[0x65] = &sCPU::op_adc_dp; +optbl[0x25] = &sCPU::op_and_dp; +optbl[0x24] = &sCPU::op_bit_dp; +optbl[0xc5] = &sCPU::op_cmp_dp; +optbl[0xe4] = &sCPU::op_cpx_dp; +optbl[0xc4] = &sCPU::op_cpy_dp; +optbl[0x45] = &sCPU::op_eor_dp; +optbl[0xa5] = &sCPU::op_lda_dp; +optbl[0xa6] = &sCPU::op_ldx_dp; +optbl[0xa4] = &sCPU::op_ldy_dp; +optbl[0x05] = &sCPU::op_ora_dp; +optbl[0xe5] = &sCPU::op_sbc_dp; +optbl[0x75] = &sCPU::op_adc_dpx; +optbl[0x35] = &sCPU::op_and_dpx; +optbl[0x34] = &sCPU::op_bit_dpx; +optbl[0xd5] = &sCPU::op_cmp_dpx; +optbl[0x55] = &sCPU::op_eor_dpx; +optbl[0xb5] = &sCPU::op_lda_dpx; +optbl[0xb4] = &sCPU::op_ldy_dpx; +optbl[0x15] = &sCPU::op_ora_dpx; +optbl[0xf5] = &sCPU::op_sbc_dpx; +optbl[0xb6] = &sCPU::op_ldx_dpy; +optbl[0x72] = &sCPU::op_adc_idp; +optbl[0x32] = &sCPU::op_and_idp; +optbl[0xd2] = &sCPU::op_cmp_idp; +optbl[0x52] = &sCPU::op_eor_idp; +optbl[0xb2] = &sCPU::op_lda_idp; +optbl[0x12] = &sCPU::op_ora_idp; +optbl[0xf2] = &sCPU::op_sbc_idp; +optbl[0x61] = &sCPU::op_adc_idpx; +optbl[0x21] = &sCPU::op_and_idpx; +optbl[0xc1] = &sCPU::op_cmp_idpx; +optbl[0x41] = &sCPU::op_eor_idpx; +optbl[0xa1] = &sCPU::op_lda_idpx; +optbl[0x01] = &sCPU::op_ora_idpx; +optbl[0xe1] = &sCPU::op_sbc_idpx; +optbl[0x71] = &sCPU::op_adc_idpy; +optbl[0x31] = &sCPU::op_and_idpy; +optbl[0xd1] = &sCPU::op_cmp_idpy; +optbl[0x51] = &sCPU::op_eor_idpy; +optbl[0xb1] = &sCPU::op_lda_idpy; +optbl[0x11] = &sCPU::op_ora_idpy; +optbl[0xf1] = &sCPU::op_sbc_idpy; +optbl[0x67] = &sCPU::op_adc_ildp; +optbl[0x27] = &sCPU::op_and_ildp; +optbl[0xc7] = &sCPU::op_cmp_ildp; +optbl[0x47] = &sCPU::op_eor_ildp; +optbl[0xa7] = &sCPU::op_lda_ildp; +optbl[0x07] = &sCPU::op_ora_ildp; +optbl[0xe7] = &sCPU::op_sbc_ildp; +optbl[0x77] = &sCPU::op_adc_ildpy; +optbl[0x37] = &sCPU::op_and_ildpy; +optbl[0xd7] = &sCPU::op_cmp_ildpy; +optbl[0x57] = &sCPU::op_eor_ildpy; +optbl[0xb7] = &sCPU::op_lda_ildpy; +optbl[0x17] = &sCPU::op_ora_ildpy; +optbl[0xf7] = &sCPU::op_sbc_ildpy; +optbl[0x63] = &sCPU::op_adc_sr; +optbl[0x23] = &sCPU::op_and_sr; +optbl[0xc3] = &sCPU::op_cmp_sr; +optbl[0x43] = &sCPU::op_eor_sr; +optbl[0xa3] = &sCPU::op_lda_sr; +optbl[0x03] = &sCPU::op_ora_sr; +optbl[0xe3] = &sCPU::op_sbc_sr; +optbl[0x73] = &sCPU::op_adc_isry; +optbl[0x33] = &sCPU::op_and_isry; +optbl[0xd3] = &sCPU::op_cmp_isry; +optbl[0x53] = &sCPU::op_eor_isry; +optbl[0xb3] = &sCPU::op_lda_isry; +optbl[0x13] = &sCPU::op_ora_isry; +optbl[0xf3] = &sCPU::op_sbc_isry; +optbl[0x89] = &sCPU::op_bit_const; +optbl[0x8d] = &sCPU::op_sta_addr; +optbl[0x8e] = &sCPU::op_stx_addr; +optbl[0x8c] = &sCPU::op_sty_addr; +optbl[0x9c] = &sCPU::op_stz_addr; +optbl[0x9d] = &sCPU::op_sta_addrx; +optbl[0x9e] = &sCPU::op_stz_addrx; +optbl[0x99] = &sCPU::op_sta_addry; +optbl[0x8f] = &sCPU::op_sta_long; +optbl[0x9f] = &sCPU::op_sta_longx; +optbl[0x85] = &sCPU::op_sta_dp; +optbl[0x86] = &sCPU::op_stx_dp; +optbl[0x84] = &sCPU::op_sty_dp; +optbl[0x64] = &sCPU::op_stz_dp; +optbl[0x95] = &sCPU::op_sta_dpx; +optbl[0x94] = &sCPU::op_sty_dpx; +optbl[0x74] = &sCPU::op_stz_dpx; +optbl[0x96] = &sCPU::op_stx_dpy; +optbl[0x92] = &sCPU::op_sta_idp; +optbl[0x87] = &sCPU::op_sta_ildp; +optbl[0x81] = &sCPU::op_sta_idpx; +optbl[0x91] = &sCPU::op_sta_idpy; +optbl[0x97] = &sCPU::op_sta_ildpy; +optbl[0x83] = &sCPU::op_sta_sr; +optbl[0x93] = &sCPU::op_sta_isry; +optbl[0x1a] = &sCPU::op_inc; +optbl[0xe8] = &sCPU::op_inx; +optbl[0xc8] = &sCPU::op_iny; +optbl[0x3a] = &sCPU::op_dec; +optbl[0xca] = &sCPU::op_dex; +optbl[0x88] = &sCPU::op_dey; +optbl[0x0a] = &sCPU::op_asl; +optbl[0x4a] = &sCPU::op_lsr; +optbl[0x2a] = &sCPU::op_rol; +optbl[0x6a] = &sCPU::op_ror; +optbl[0xee] = &sCPU::op_inc_addr; +optbl[0xce] = &sCPU::op_dec_addr; +optbl[0x0e] = &sCPU::op_asl_addr; +optbl[0x4e] = &sCPU::op_lsr_addr; +optbl[0x2e] = &sCPU::op_rol_addr; +optbl[0x6e] = &sCPU::op_ror_addr; +optbl[0x1c] = &sCPU::op_trb_addr; +optbl[0x0c] = &sCPU::op_tsb_addr; +optbl[0xfe] = &sCPU::op_inc_addrx; +optbl[0xde] = &sCPU::op_dec_addrx; +optbl[0x1e] = &sCPU::op_asl_addrx; +optbl[0x5e] = &sCPU::op_lsr_addrx; +optbl[0x3e] = &sCPU::op_rol_addrx; +optbl[0x7e] = &sCPU::op_ror_addrx; +optbl[0xe6] = &sCPU::op_inc_dp; +optbl[0xc6] = &sCPU::op_dec_dp; +optbl[0x06] = &sCPU::op_asl_dp; +optbl[0x46] = &sCPU::op_lsr_dp; +optbl[0x26] = &sCPU::op_rol_dp; +optbl[0x66] = &sCPU::op_ror_dp; +optbl[0x14] = &sCPU::op_trb_dp; +optbl[0x04] = &sCPU::op_tsb_dp; +optbl[0xf6] = &sCPU::op_inc_dpx; +optbl[0xd6] = &sCPU::op_dec_dpx; +optbl[0x16] = &sCPU::op_asl_dpx; +optbl[0x56] = &sCPU::op_lsr_dpx; +optbl[0x36] = &sCPU::op_rol_dpx; +optbl[0x76] = &sCPU::op_ror_dpx; +optbl[0x90] = &sCPU::op_bcc; +optbl[0xb0] = &sCPU::op_bcs; +optbl[0xd0] = &sCPU::op_bne; +optbl[0xf0] = &sCPU::op_beq; +optbl[0x10] = &sCPU::op_bpl; +optbl[0x30] = &sCPU::op_bmi; +optbl[0x50] = &sCPU::op_bvc; +optbl[0x70] = &sCPU::op_bvs; +optbl[0x80] = &sCPU::op_bra; +optbl[0x82] = &sCPU::op_brl; +optbl[0x4c] = &sCPU::op_jmp_addr; +optbl[0x5c] = &sCPU::op_jmp_long; +optbl[0x6c] = &sCPU::op_jmp_iaddr; +optbl[0x7c] = &sCPU::op_jmp_iaddrx; +optbl[0xdc] = &sCPU::op_jmp_iladdr; +optbl[0x20] = &sCPU::op_jsr_addr; +optbl[0x22] = &sCPU::op_jsr_long; +optbl[0xfc] = &sCPU::op_jsr_iaddrx; +optbl[0x40] = &sCPU::op_rti; +optbl[0x60] = &sCPU::op_rts; +optbl[0x6b] = &sCPU::op_rtl; +optbl[0xea] = &sCPU::op_nop; +optbl[0x42] = &sCPU::op_wdm; +optbl[0xeb] = &sCPU::op_xba; +optbl[0x54] = &sCPU::op_mvn; +optbl[0x44] = &sCPU::op_mvp; +optbl[0x00] = &sCPU::op_brk; +optbl[0x02] = &sCPU::op_cop; +optbl[0xdb] = &sCPU::op_stp; +optbl[0xcb] = &sCPU::op_wai; +optbl[0xfb] = &sCPU::op_xce; +optbl[0x18] = &sCPU::op_clc; +optbl[0xd8] = &sCPU::op_cld; +optbl[0x58] = &sCPU::op_cli; +optbl[0xb8] = &sCPU::op_clv; +optbl[0x38] = &sCPU::op_sec; +optbl[0xf8] = &sCPU::op_sed; +optbl[0x78] = &sCPU::op_sei; +optbl[0xc2] = &sCPU::op_rep; +optbl[0xe2] = &sCPU::op_sep; +optbl[0xaa] = &sCPU::op_tax; +optbl[0xa8] = &sCPU::op_tay; +optbl[0x8a] = &sCPU::op_txa; +optbl[0x9b] = &sCPU::op_txy; +optbl[0x98] = &sCPU::op_tya; +optbl[0xbb] = &sCPU::op_tyx; +optbl[0x5b] = &sCPU::op_tcd; +optbl[0x1b] = &sCPU::op_tcs; +optbl[0x7b] = &sCPU::op_tdc; +optbl[0x3b] = &sCPU::op_tsc; +optbl[0xba] = &sCPU::op_tsx; +optbl[0x9a] = &sCPU::op_txs; +optbl[0x48] = &sCPU::op_pha; +optbl[0xda] = &sCPU::op_phx; +optbl[0x5a] = &sCPU::op_phy; +optbl[0x0b] = &sCPU::op_phd; +optbl[0x8b] = &sCPU::op_phb; +optbl[0x4b] = &sCPU::op_phk; +optbl[0x08] = &sCPU::op_php; +optbl[0x68] = &sCPU::op_pla; +optbl[0xfa] = &sCPU::op_plx; +optbl[0x7a] = &sCPU::op_ply; +optbl[0x2b] = &sCPU::op_pld; +optbl[0xab] = &sCPU::op_plb; +optbl[0x28] = &sCPU::op_plp; +optbl[0xf4] = &sCPU::op_pea; +optbl[0xd4] = &sCPU::op_pei; +optbl[0x62] = &sCPU::op_per; diff --git a/src/cpu/scpu/core/scpugen.cpp b/src/cpu/scpu/core/scpugen.cpp index 2047cecd..fe1aa9b1 100644 --- a/src/cpu/scpu/core/scpugen.cpp +++ b/src/cpu/scpu/core/scpugen.cpp @@ -1,9 +1,9 @@ #define CLASS_NAME "sCPU" -#include "../../../lib/opgen_s.cpp" +#include "../../../lib/opgen_so.cpp" int main() { -//fph = fopen("op.h", "wb"); -//fpt = fopen("optable.cpp", "wb"); + fph = fopen("op.h", "wb"); + fpt = fopen("optable.cpp", "wb"); generate("op_read.cpp", "op_read.b"); generate("op_write.cpp", "op_write.b"); @@ -11,8 +11,8 @@ int main() { generate("op_pc.cpp", "op_pc.b"); generate("op_misc.cpp", "op_misc.b"); -//fclose(fph); -//fclose(fpt); + fclose(fph); + fclose(fpt); return 0; } diff --git a/src/cpu/scpu/scpu.cpp b/src/cpu/scpu/scpu.cpp index 4fdba6fd..ae4be0ff 100644 --- a/src/cpu/scpu/scpu.cpp +++ b/src/cpu/scpu/scpu.cpp @@ -48,5 +48,9 @@ void sCPU::reset() { apu_port[3] = 0x00; } -sCPU::sCPU() {} -sCPU::~sCPU() {} +sCPU::sCPU() { + #include "core/optable.cpp" +} + +sCPU::~sCPU() { +} diff --git a/src/cpu/scpu/timing/timing.cpp b/src/cpu/scpu/timing/timing.cpp index 31aa1532..8809e80c 100644 --- a/src/cpu/scpu/timing/timing.cpp +++ b/src/cpu/scpu/timing/timing.cpp @@ -283,7 +283,7 @@ void sCPU::timing_reset() { //initial latch values for $213c/$213d //[x]0035 : [y]0000 (53.0 -> 212) [lda $2137] //[x]0038 : [y]0000 (56.5 -> 226) [nop : lda $2137] - add_clocks(186); +//add_clocks(186); } #undef ntsc_color_burst_phase_shift_scanline diff --git a/src/dsp/adsp/adsp.cpp b/src/dsp/adsp/adsp.cpp new file mode 100644 index 00000000..1a102662 --- /dev/null +++ b/src/dsp/adsp/adsp.cpp @@ -0,0 +1,586 @@ +#include "../../base.h" +#include "adsp_tables.cpp" + +void aDSP::enter() { loop: + run(); + goto loop; +} + +uint8 aDSP::readb(uint16 addr) { + return spcram[addr]; +} + +void aDSP::writeb(uint16 addr, uint8 data) { + spcram[addr] = data; +} + +uint16 aDSP::readw(uint16 addr) { + return (readb(addr + 0)) | (readb(addr + 1) << 8); +} + +void aDSP::writew(uint16 addr, uint16 data) { + writeb(addr + 0, data); + writeb(addr + 1, data >> 8); +} + +uint8 aDSP::read(uint8 addr) { + addr &= 127; +int v = addr >> 4; +int n = addr & 15; + + switch(addr) { + case 0x00: case 0x10: case 0x20: case 0x30: + case 0x40: case 0x50: case 0x60: case 0x70: + return voice[v].VOLL; + case 0x01: case 0x11: case 0x21: case 0x31: + case 0x41: case 0x51: case 0x61: case 0x71: + return voice[v].VOLR; + case 0x02: case 0x12: case 0x22: case 0x32: + case 0x42: case 0x52: case 0x62: case 0x72: + return voice[v].PITCH; + case 0x03: case 0x13: case 0x23: case 0x33: + case 0x43: case 0x53: case 0x63: case 0x73: + return voice[v].PITCH >> 8; + case 0x04: case 0x14: case 0x24: case 0x34: + case 0x44: case 0x54: case 0x64: case 0x74: + return voice[v].SRCN; + case 0x05: case 0x15: case 0x25: case 0x35: + case 0x45: case 0x55: case 0x65: case 0x75: + return voice[v].ADSR1; + case 0x06: case 0x16: case 0x26: case 0x36: + case 0x46: case 0x56: case 0x66: case 0x76: + return voice[v].ADSR2; + case 0x07: case 0x17: case 0x27: case 0x37: + case 0x47: case 0x57: case 0x67: case 0x77: + return voice[v].GAIN; + case 0x08: case 0x18: case 0x28: case 0x38: + case 0x48: case 0x58: case 0x68: case 0x78: + return voice[v].ENVX; + case 0x09: case 0x19: case 0x29: case 0x39: + case 0x49: case 0x59: case 0x69: case 0x79: + return voice[v].OUTX; + + case 0x0f: case 0x1f: case 0x2f: case 0x3f: + case 0x4f: case 0x5f: case 0x6f: case 0x7f: + return status.FIR[v]; + + case 0x0c: return status.MVOLL; + case 0x1c: return status.MVOLR; + case 0x2c: return status.EVOLL; + case 0x3c: return status.EVOLR; + case 0x4c: return status.KON; + case 0x5c: return status.KOFF; + case 0x6c: return status.FLG; + case 0x7c: return status.ENDX; + + case 0x0d: return status.EFB; + case 0x2d: return status.PMON; + case 0x3d: return status.NON; + case 0x4d: return status.EON; + case 0x5d: return status.DIR; + case 0x6d: return status.ESA; + case 0x7d: return status.EDL; + } + + return dspram[addr]; +} + +void aDSP::write(uint8 addr, uint8 data) { +//0x80-0xff is a read-only mirror of 0x00-0x7f + if(addr & 0x80)return; + +int v = addr >> 4; +int n = addr & 15; + + switch(addr) { + case 0x00: case 0x10: case 0x20: case 0x30: + case 0x40: case 0x50: case 0x60: case 0x70: + voice[v].VOLL = data; + break; + case 0x01: case 0x11: case 0x21: case 0x31: + case 0x41: case 0x51: case 0x61: case 0x71: + voice[v].VOLR = data; + break; + case 0x02: case 0x12: case 0x22: case 0x32: + case 0x42: case 0x52: case 0x62: case 0x72: + voice[v].PITCH &= 0xff00; + voice[v].PITCH |= data; + break; + case 0x03: case 0x13: case 0x23: case 0x33: + case 0x43: case 0x53: case 0x63: case 0x73: + voice[v].PITCH &= 0x00ff; + voice[v].PITCH |= data << 8; + break; + case 0x04: case 0x14: case 0x24: case 0x34: + case 0x44: case 0x54: case 0x64: case 0x74: + voice[v].SRCN = data; + break; + case 0x05: case 0x15: case 0x25: case 0x35: + case 0x45: case 0x55: case 0x65: case 0x75: + voice[v].ADSR1 = data; + voice[v].AdjustEnvelope(); + break; + case 0x06: case 0x16: case 0x26: case 0x36: + case 0x46: case 0x56: case 0x66: case 0x76: + voice[v].ADSR2 = data; + //sustain_level = 0-7, 7 is a special case handled by ATTACK envx mode + voice[v].env_sustain = (voice[v].ADSR_sus_level() + 1) << 8; + voice[v].AdjustEnvelope(); + break; + case 0x07: case 0x17: case 0x27: case 0x37: + case 0x47: case 0x57: case 0x67: case 0x77: + voice[v].GAIN = data; + voice[v].AdjustEnvelope(); + break; + case 0x08: case 0x18: case 0x28: case 0x38: + case 0x48: case 0x58: case 0x68: case 0x78: + voice[v].ENVX = data; + break; + case 0x09: case 0x19: case 0x29: case 0x39: + case 0x49: case 0x59: case 0x69: case 0x79: + voice[v].OUTX = data; + break; + + case 0x0f: case 0x1f: case 0x2f: case 0x3f: + case 0x4f: case 0x5f: case 0x6f: case 0x7f: + status.FIR[v] = data; + break; + + case 0x0c: status.MVOLL = data; break; + case 0x1c: status.MVOLR = data; break; + case 0x2c: status.EVOLL = data; break; + case 0x3c: status.EVOLR = data; break; + + case 0x4c: + status.KON = data; + status.kon = data; + break; + case 0x5c: + status.KOFF = data; + break; + case 0x6c: + status.FLG = data; + status.noise_rate = rate_table[data & 0x1f]; + break; + + case 0x7c: + //read-only register, writes clear all bits of ENDX + status.ENDX = 0; + break; + + case 0x0d: status.EFB = data; break; + case 0x2d: status.PMON = data; break; + case 0x3d: status.NON = data; break; + case 0x4d: status.EON = data; break; + case 0x5d: status.DIR = data; break; + case 0x6d: status.ESA = data; break; + case 0x7d: status.EDL = data; break; + } + + dspram[addr] = data; +} + +void aDSP::power() { + spcram = r_smp->get_spcram_handle(); + memset(dspram, 0x00, 128); + + for(int v = 0; v < 8; v++) { + voice[v].VOLL = 0; + voice[v].VOLR = 0; + voice[v].PITCH = 0; + voice[v].SRCN = 0; + voice[v].ADSR1 = 0; + voice[v].ADSR2 = 0; + voice[v].GAIN = 0; + + status.FIR[v] = 0; + } + + status.FLG = 0xe0; + status.MVOLL = status.MVOLR = 0; + status.EVOLL = status.EVOLR = 0; + status.ENDX = 0; + status.EFB = 0; + status.PMON = 0; + status.NON = 0; + status.EON = 0; + status.DIR = 0; + status.ESA = 0; + status.EDL = 0; + + status.echo_length = 0; + + reset(); +} + +void aDSP::reset() { + status.KON = 0x00; + status.KOFF = 0x00; + status.FLG |= 0xe0; + + status.kon = 0x00; + status.esa = 0x00; + + status.noise_ctr = 0; + status.noise_rate = 0; + status.noise_sample = 0x4000; + + status.echo_index = 0; + status.fir_buffer_index = 0; + + for(int v = 0; v < 8; v++) { + voice[v].ENVX = 0; + voice[v].OUTX = 0; + + voice[v].pitch_ctr = 0; + + voice[v].brr_index = 0; + voice[v].brr_ptr = readw((status.DIR << 8) + (voice[v].SRCN << 2)); + voice[v].brr_looped = false; + voice[v].brr_data[0] = 0; + voice[v].brr_data[1] = 0; + voice[v].brr_data[2] = 0; + voice[v].brr_data[3] = 0; + voice[v].brr_data_index = 0; + + voice[v].envx = 0; + voice[v].env_ctr = 0; + voice[v].env_rate = 0; + voice[v].env_state = SILENCE; + voice[v].env_mode = DIRECT; + + status.fir_buffer[0][v] = 0; + status.fir_buffer[1][v] = 0; + } + + dsp_counter = 0; +} + +void aDSP::run() { +uint8 pmon; +int32 sample; +int32 msamplel, msampler; +int32 esamplel, esampler; +int32 fir_samplel, fir_sampler; + pmon = status.PMON & ~status.NON & ~1; + + if((dsp_counter++ & 1) == 0) { + for(uint v = 0; v < 8; v++) { + if(status.soft_reset()) { + if(voice[v].env_state != SILENCE) { + voice[v].env_state = SILENCE; + voice[v].AdjustEnvelope(); + } + } + if(status.KOFF & (1 << v)) { + if(voice[v].env_state != SILENCE && voice[v].env_state != RELEASE) { + voice[v].env_state = RELEASE; + voice[v].AdjustEnvelope(); + } + } + if(status.kon & (1 << v)) { + voice[v].brr_ptr = readw((status.DIR << 8) + (voice[v].SRCN << 2)); + voice[v].brr_index = -9; + voice[v].brr_looped = false; + voice[v].brr_data[0] = 0; + voice[v].brr_data[1] = 0; + voice[v].brr_data[2] = 0; + voice[v].brr_data[3] = 0; + voice[v].envx = 0; + voice[v].env_state = ATTACK; + voice[v].AdjustEnvelope(); + } + } + status.ENDX &= ~status.kon; + status.kon = 0; + } + +/***** + * update noise + *****/ + status.noise_ctr += status.noise_rate; + if(status.noise_ctr >= 0x7800) { + status.noise_ctr -= 0x7800; + status.noise_sample = (status.noise_sample >> 1) | (((status.noise_sample << 14) ^ (status.noise_sample << 13)) & 0x4000); + } + + msamplel = msampler = 0; + esamplel = esampler = 0; + +/***** + * process voice channels + *****/ + for(int v = 0; v < 8; v++) { + if(voice[v].brr_index < -1) { + voice[v].brr_index++; + voice[v].OUTX = voice[v].outx = 0; + voice[v].ENVX = 0; + continue; + } + + if(voice[v].brr_index >= 0) { + if(pmon & (1 << v)) { + voice[v].pitch_ctr += (voice[v].pitch_rate() * (voice[v - 1].outx + 0x8000)) >> 15; + } else { + voice[v].pitch_ctr += voice[v].pitch_rate(); + } + } else { + voice[v].pitch_ctr = 0x3000; + voice[v].brr_index = 0; + } + + /***** + * decode BRR samples + *****/ + while(voice[v].pitch_ctr >= 0) { + voice[v].pitch_ctr -= 0x1000; + + voice[v].brr_data_index++; + voice[v].brr_data_index &= 3; + + if(voice[v].brr_index == 0) { + voice[v].brr_header = readb(voice[v].brr_ptr); + + if(voice[v].brr_header_flags() == BRR_END) { + status.ENDX |= (1 << v); + voice[v].env_state = SILENCE; + voice[v].AdjustEnvelope(); + } + } + +#define S(x) voice[v].brr_data[(voice[v].brr_data_index + (x)) & 3] + if(voice[v].env_state != SILENCE) { + sample = readb(voice[v].brr_ptr + 1 + (voice[v].brr_index >> 1)); + if(voice[v].brr_index & 1) { + sample = sclip<4>(sample); + } else { + sample = sclip<4>(sample >> 4); + } + + if(voice[v].brr_header_shift() <= 12) { + sample = (sample << voice[v].brr_header_shift() >> 1); + } else { + sample &= ~0x7ff; + } + + switch(voice[v].brr_header_filter()) { + case 0: //direct + break; + case 1: //15/16 + sample += S(-1) + ((-S(-1)) >> 4); + break; + case 2: //61/32 - 15/16 + sample += (S(-1) << 1) + ((-((S(-1) << 1) + S(-1))) >> 5) + - S(-2) + (S(-2) >> 4); + break; + case 3: //115/64 - 13/16 + sample += (S(-1) << 1) + ((-(S(-1) + (S(-1) << 2) + (S(-1) << 3))) >> 6) + - S(-2) + (((S(-2) << 1) + S(-2)) >> 4); + break; + } + + S(0) = sample = sclip<15>(sclamp<16>(sample)); + } else { + S(0) = sample = 0; + } + + if(++voice[v].brr_index > 15) { + voice[v].brr_index = 0; + if(voice[v].brr_header_flags() & BRR_END) { + if(voice[v].brr_header_flags() & BRR_LOOP) { + status.ENDX |= (1 << v); + } + voice[v].brr_ptr = readw((status.DIR << 8) + (voice[v].SRCN << 2) + 2); + voice[v].brr_looped = true; + } else { + voice[v].brr_ptr += 9; + } + } + } + + /***** + * volume envelope adjust + *****/ + voice[v].env_ctr += voice[v].env_rate; + + if(voice[v].env_ctr >= 0x7800) { + voice[v].env_ctr -= 0x7800; + switch(voice[v].env_mode) { + case DIRECT: + voice[v].env_rate = 0; + break; + case LINEAR_DEC: + voice[v].envx -= 32; + if(voice[v].envx <= 0) { + voice[v].envx = 0; + voice[v].env_rate = 0; + voice[v].env_mode = DIRECT; + } + break; + case LINEAR_INC: + voice[v].envx += 32; + if(voice[v].envx >= 0x7ff) { + voice[v].envx = 0x7ff; + voice[v].env_rate = 0; + voice[v].env_mode = DIRECT; + if(voice[v].ADSR_enabled() && voice[v].env_state == ATTACK) { + voice[v].env_state = ((voice[v].env_sustain == 0x800) ? SUSTAIN : DECAY); + voice[v].AdjustEnvelope(); + } + } + break; + case EXP_DEC: + //multiply by 255/256ths + voice[v].envx -= ((voice[v].envx - 1) >> 8) + 1; + if(voice[v].ADSR_enabled() && voice[v].env_state == DECAY && voice[v].envx <= voice[v].env_sustain) { + voice[v].env_state = SUSTAIN; + voice[v].AdjustEnvelope(); + } else if(voice[v].envx <= 0) { + voice[v].envx = 0; + voice[v].env_rate = 0; + voice[v].env_mode = DIRECT; + } + break; + case BENT_INC: + if(voice[v].envx < 0x600) { + voice[v].envx += 32; + } else { + voice[v].envx += 8; + + if(voice[v].envx >= 0x7ff) { + voice[v].envx = 0x7ff; + voice[v].env_rate = 0; + voice[v].env_mode = DIRECT; + } + } + break; + case FAST_ATTACK: + voice[v].envx += 0x400; + if(voice[v].envx >= 0x7ff) { + voice[v].envx = 0x7ff; + + //attack raises to max envx. if sustain is also set to max envx, skip decay phase + voice[v].env_state = ((voice[v].env_sustain == 0x800) ? SUSTAIN : DECAY); + voice[v].AdjustEnvelope(); + } + break; + case RELEASE_DEC: + voice[v].envx -= 8; + if(voice[v].envx <= 0) { + voice[v].env_state = SILENCE; + voice[v].AdjustEnvelope(); + } + break; + } + } + + voice[v].ENVX = voice[v].envx >> 4; + + /***** + * gaussian interpolation / noise + *****/ + if(status.NON & (1 << v)) { + sample = sclip<15>(status.noise_sample); + } else { + int32 d = voice[v].pitch_ctr >> 4; //-256 <= sample <= -1 + sample = ((gaussian_table[ -1 - d] * S(-3)) >> 11); + sample += ((gaussian_table[255 - d] * S(-2)) >> 11); + sample += ((gaussian_table[512 + d] * S(-1)) >> 11); + sample = sclip <15>(sample); + sample += ((gaussian_table[256 + d] * S( 0)) >> 11); + sample = sclamp<15>(sample); + } +#undef S + + /***** + * envelope / volume adjust + *****/ + sample = (sample * voice[v].envx) >> 11; + voice[v].outx = sample << 1; + voice[v].OUTX = sample >> 7; + + if(!status.mute()) { + msamplel += ((sample * voice[v].VOLL) >> 7) << 1; + msampler += ((sample * voice[v].VOLR) >> 7) << 1; + } + + if((status.EON & (1 << v)) && status.echo_write()) { + esamplel += ((sample * voice[v].VOLL) >> 7) << 1; + esampler += ((sample * voice[v].VOLR) >> 7) << 1; + } + } + +/***** + * echo (FIR) adjust + *****/ +#define F(c,x) status.fir_buffer[c][(status.fir_buffer_index + (x)) & 7] + status.fir_buffer_index++; + F(0,0) = readw((status.esa << 8) + status.echo_index + 0); + F(1,0) = readw((status.esa << 8) + status.echo_index + 2); + + fir_samplel = (F(0,-0) * status.FIR[7] + + F(0,-1) * status.FIR[6] + + F(0,-2) * status.FIR[5] + + F(0,-3) * status.FIR[4] + + F(0,-4) * status.FIR[3] + + F(0,-5) * status.FIR[2] + + F(0,-6) * status.FIR[1] + + F(0,-7) * status.FIR[0]); + + fir_sampler = (F(1,-0) * status.FIR[7] + + F(1,-1) * status.FIR[6] + + F(1,-2) * status.FIR[5] + + F(1,-3) * status.FIR[4] + + F(1,-4) * status.FIR[3] + + F(1,-5) * status.FIR[2] + + F(1,-6) * status.FIR[1] + + F(1,-7) * status.FIR[0]); +#undef F + +/***** + * update echo buffer + *****/ + if(status.echo_write()) { + esamplel += (fir_samplel * status.EFB) >> 14; + esampler += (fir_sampler * status.EFB) >> 14; + + esamplel = sclamp<16>(esamplel); + esampler = sclamp<16>(esampler); + + writew((status.esa << 8) + status.echo_index + 0, esamplel); + writew((status.esa << 8) + status.echo_index + 2, esampler); + } + + status.echo_index += 4; + if(status.echo_index >= status.echo_length) { + status.echo_index = 0; + status.echo_length = (status.EDL & 0x0f) << 11; + } + +//ESA read occurs at roughly 22/32th sample +//ESA fetch occurs at roughly 29/32th sample +//as this is not a subsample-level S-DSP emulator, +//simulate ~25/32th delay by caching ESA for one +//complete sample ... + status.esa = status.ESA; + +/***** + * main output adjust + *****/ + if(!status.mute()) { + msamplel = (msamplel * status.MVOLL) >> 7; + msampler = (msampler * status.MVOLR) >> 7; + + msamplel += (fir_samplel * status.EVOLL) >> 14; + msampler += (fir_sampler * status.EVOLR) >> 14; + + msamplel = sclamp<16>(msamplel); + msampler = sclamp<16>(msampler); + } + + snes.audio_update(msamplel, msampler); + scheduler.addclocks_dsp(32 * 3); +} + +aDSP::aDSP() {} +aDSP::~aDSP() {} diff --git a/src/dsp/adsp/adsp.h b/src/dsp/adsp/adsp.h new file mode 100644 index 00000000..3d99a192 --- /dev/null +++ b/src/dsp/adsp/adsp.h @@ -0,0 +1,172 @@ +class aDSP : public DSP { +private: +uint8 dspram[128]; +uint8 *spcram; + +uint32 dsp_counter; + +enum { BRR_END = 1, BRR_LOOP = 2 }; + +uint8 readb (uint16 addr); +uint16 readw (uint16 addr); +void writeb(uint16 addr, uint8 data); +void writew(uint16 addr, uint16 data); + +public: +static const uint16 rate_table[32]; +static const int16 gaussian_table[512]; + +enum EnvelopeStates { + ATTACK, + DECAY, + SUSTAIN, + RELEASE, + SILENCE +}; + +enum EnvelopeModes { + DIRECT, + LINEAR_DEC, + EXP_DEC, + LINEAR_INC, + BENT_INC, + + FAST_ATTACK, + RELEASE_DEC +}; + +private: +struct Status { +//$0c,$1c + int8 MVOLL, MVOLR; +//$2c,$3c + int8 EVOLL, EVOLR; +//$4c,$5c + uint8 KON, KOFF; +//$6c + uint8 FLG; +//$7c + uint8 ENDX; +//$0d + int8 EFB; +//$2d,$3d,$4d + uint8 PMON, NON, EON; +//$5d + uint8 DIR; +//$6d,$7d + uint8 ESA, EDL; + +//$xf + int8 FIR[8]; + +//internal variables + uint8 kon, esa; + + int16 noise_ctr, noise_rate; + uint16 noise_sample; + + uint16 echo_index, echo_length; + int16 fir_buffer[2][8]; + uint8 fir_buffer_index; + +//functions + bool soft_reset() { return !!(FLG & 0x80); } + bool mute() { return !!(FLG & 0x40); } + bool echo_write() { return !(FLG & 0x20); } +} status; + +struct Voice { +//$x0-$x1 + int8 VOLL, VOLR; +//$x2-$x3 + int16 PITCH; +//$x4 + uint8 SRCN; +//$x5-$x7 + uint8 ADSR1, ADSR2, GAIN; +//$x8-$x9 + uint8 ENVX, OUTX; + +//internal variables + int16 pitch_ctr; + + int8 brr_index; + uint16 brr_ptr; + uint8 brr_header; + bool brr_looped; + + int16 brr_data[4]; + uint8 brr_data_index; + + int16 envx; + uint16 env_ctr, env_rate, env_sustain; + enum EnvelopeStates env_state; + enum EnvelopeModes env_mode; + + int16 outx; + +//functions + int16 pitch_rate() { return PITCH & 0x3fff; } + + uint8 brr_header_shift() { return brr_header >> 4; } + uint8 brr_header_filter() { return (brr_header >> 2) & 3; } + uint8 brr_header_flags() { return brr_header & 3; } + + bool ADSR_enabled() { return !!(ADSR1 & 0x80); } + uint8 ADSR_decay() { return (ADSR1 >> 4) & 7; } + uint8 ADSR_attack() { return ADSR1 & 15; } + uint8 ADSR_sus_level() { return ADSR2 >> 5; } + uint8 ADSR_sus_rate() { return ADSR2 & 31; } + + void AdjustEnvelope() { + if(env_state == SILENCE) { + env_mode = DIRECT; + env_rate = 0; + envx = 0; + } else if(env_state == RELEASE) { + env_mode = RELEASE_DEC; + env_rate = 0x7800; + } else if(ADSR_enabled()) { + switch(env_state) { + case ATTACK: + env_rate = rate_table[(ADSR_attack() << 1) + 1]; + env_mode = (env_rate == 0x7800) ? FAST_ATTACK : LINEAR_INC; + break; + case DECAY: + env_rate = rate_table[(ADSR_decay() << 1) + 0x10]; + env_mode = EXP_DEC; + break; + case SUSTAIN: + env_rate = rate_table[ADSR_sus_rate()]; + env_mode = (env_rate == 0) ? DIRECT : EXP_DEC; + break; + } + } else if(GAIN & 0x80) { + switch(GAIN & 0x60) { + case 0x00: env_mode = LINEAR_DEC; break; + case 0x20: env_mode = EXP_DEC; break; + case 0x40: env_mode = LINEAR_INC; break; + case 0x60: env_mode = BENT_INC; break; + } + env_rate = rate_table[GAIN & 0x1f]; + } else { + env_mode = DIRECT; + env_rate = 0; + envx = (GAIN & 0x7f) << 4; + } + } +} voice[8]; + +public: + void enter(); + void run(); + + uint8 read (uint8 addr); + void write(uint8 addr, uint8 data); + + void power(); + void reset(); + + aDSP(); + ~aDSP(); +}; diff --git a/src/dsp/bdsp/bdsp_tables.cpp b/src/dsp/adsp/adsp_tables.cpp similarity index 96% rename from src/dsp/bdsp/bdsp_tables.cpp rename to src/dsp/adsp/adsp_tables.cpp index 27e12904..bb72e587 100644 --- a/src/dsp/bdsp/bdsp_tables.cpp +++ b/src/dsp/adsp/adsp_tables.cpp @@ -1,11 +1,11 @@ -const uint16 bDSP::RateTable[32] = { +const uint16 aDSP::rate_table[32] = { 0x0000, 0x000F, 0x0014, 0x0018, 0x001E, 0x0028, 0x0030, 0x003C, 0x0050, 0x0060, 0x0078, 0x00A0, 0x00C0, 0x00F0, 0x0140, 0x0180, 0x01E0, 0x0280, 0x0300, 0x03C0, 0x0500, 0x0600, 0x0780, 0x0A00, 0x0C00, 0x0F00, 0x1400, 0x1800, 0x1E00, 0x2800, 0x3C00, 0x7800 }; -const int16 bDSP::GaussTable[512] = { +const int16 aDSP::gaussian_table[512] = { 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, diff --git a/src/dsp/bdsp/bdsp.cpp b/src/dsp/bdsp/bdsp.cpp index 681a4327..7afcba86 100644 --- a/src/dsp/bdsp/bdsp.cpp +++ b/src/dsp/bdsp/bdsp.cpp @@ -1,565 +1,679 @@ +/* This code is heavily customized for bsnes and requires cothreads. +Original portable snes_spc library available at http://www.slack.net/~ant/ +Copyright (C) 2007 Shay Green. See license.txt. */ + #include "../../base.h" -#include "bdsp_tables.cpp" -uint8 bDSP::readb(uint16 addr) { - return spcram[addr]; +int const brr_block_size = 9; + +// Accesses global DSP register +#define REG(n) m.regs [r_##n] + +// Accesses voice DSP register +#define VREG(r,n) r [v_##n] + +// Volume registers and efb are signed! Easy to forget int8 cast. +// Prefixes are to avoid accidental use of locals with same names. + +// Gaussian interpolation + +static short const gauss [512] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, + 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27, + 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, + 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102, + 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132, + 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168, + 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210, + 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, + 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311, + 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370, + 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434, + 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504, + 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577, + 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654, + 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732, + 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811, + 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889, + 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965, + 969, 974, 978, 983, 988, 992, 997,1001,1005,1010,1014,1019,1023,1027,1032,1036, +1040,1045,1049,1053,1057,1061,1066,1070,1074,1078,1082,1086,1090,1094,1098,1102, +1106,1109,1113,1117,1121,1125,1128,1132,1136,1139,1143,1146,1150,1153,1157,1160, +1164,1167,1170,1174,1177,1180,1183,1186,1190,1193,1196,1199,1202,1205,1207,1210, +1213,1216,1219,1221,1224,1227,1229,1232,1234,1237,1239,1241,1244,1246,1248,1251, +1253,1255,1257,1259,1261,1263,1265,1267,1269,1270,1272,1274,1275,1277,1279,1280, +1282,1283,1284,1286,1287,1288,1290,1291,1292,1293,1294,1295,1296,1297,1297,1298, +1299,1300,1300,1301,1302,1302,1303,1303,1303,1304,1304,1304,1304,1304,1305,1305, +}; + + +//// Counters + +int const simple_counter_range = 2048 * 5 * 3; // 30720 + +static unsigned const counter_rates [32] = +{ + simple_counter_range + 1, // never fires + 2048, 1536, + 1280, 1024, 768, + 640, 512, 384, + 320, 256, 192, + 160, 128, 96, + 80, 64, 48, + 40, 32, 24, + 20, 16, 12, + 10, 8, 6, + 5, 4, 3, + 2, + 1 +}; + +static unsigned const counter_offsets [32] = +{ + 1, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 0, + 0 +}; + +inline unsigned bDSP::read_counter( int rate ) +{ + return ((unsigned) m.counter + counter_offsets [rate]) % counter_rates [rate]; } -void bDSP::writeb(uint16 addr, uint8 data) { - spcram[addr] = data; + +//// Envelope + +inline void bDSP::run_envelope( voice_t* const v ) +{ + int env = v->env; + if ( v->env_mode == env_release ) + { + if ( (env -= 0x8) < 0 ) + env = 0; + v->env = env; + } + else + { + int rate; + int env_data = VREG(v->regs,adsr1); + if ( m.t_adsr0 & 0x80 ) // ADSR + { + if ( v->env_mode >= env_decay ) + { + env--; + env -= asr<8>( env ); + rate = env_data & 0x1F; + if ( v->env_mode == env_decay ) + rate = (m.t_adsr0 >> 3 & 0x0E) + 0x10; + } + else // env_attack + { + rate = (m.t_adsr0 & 0x0F) * 2 + 1; + env += rate < 31 ? 0x20 : 0x400; + } + } + else // GAIN + { + env_data = VREG(v->regs,gain); + int mode = env_data >> 5; + if ( mode < 4 ) // direct + { + env = env_data * 0x10; + rate = 31; + } + else + { + rate = env_data & 0x1F; + if ( mode == 4 ) // 4: linear decrease + { + env -= 0x20; + } + else if ( mode < 6 ) // 5: exponential decrease + { + env--; + env -= asr<8>( env ); + } + else // 6,7: linear increase + { + env += 0x20; + if ( mode > 6 && (unsigned) v->hidden_env >= 0x600 ) + env += 0x8 - 0x20; // 7: two-slope linear increase + } + } + } + + // Sustain level + if ( (env >> 8) == (env_data >> 5) && v->env_mode == env_decay ) + v->env_mode = env_sustain; + + v->hidden_env = env; + + // unsigned cast because linear decrease going negative also triggers this + if ( (unsigned) env > 0x7FF ) + { + env = (env < 0 ? 0 : 0x7FF); + if ( v->env_mode == env_attack ) + v->env_mode = env_decay; + } + + if ( !read_counter( rate ) ) + v->env = env; // nothing else is controlled by the counter + } } -uint16 bDSP::readw(uint16 addr) { - return (readb(addr)) | (readb(addr + 1) << 8); + +//// BRR Decoding + +inline void bDSP::decode_brr( voice_t* v ) +{ + // Arrange the four input nybbles in 0xABCD order for easy decoding + int nybbles = m.t_brr_byte * 0x100 + ram [(v->brr_addr + v->brr_offset + 1) & 0xFFFF]; + + // Write to next four samples in circular buffer + int* pos = &v->buf [v->buf_pos]; + if ( (v->buf_pos += 4) >= brr_buf_size ) + v->buf_pos = 0; + + // Decode four samples + for ( int* end = pos + 4; pos < end; pos++ ) + { + // Extract nybble and sign-extend + int s = asr<12>( sclip<16>( nybbles ) ); + nybbles <<= 4; + + // Shift sample based on header + int const shift = m.t_brr_header >> 4; + s = asr<1>( s << shift ); + if ( shift >= 0xD ) // handle invalid range + s = (s < 0 ? -0x800 : 0); + + // Apply IIR filter (8 is the most commonly used) + int const p1 = pos [brr_buf_size - 1]; + int const p2 = asr<1>( pos [brr_buf_size - 2] ); + switch ( m.t_brr_header >> 2 & 3 ) + { + case 1: s += asr<1>( p1 ) + asr<5>( -p1 ); break; // s += p1 * 0.4687500 + case 2: s += p1 + asr<6>( p1 * -3 ) - p2 + asr<4>( p2 ); break; // s += p1 * 0.9531250 - p2 * 0.46875 + case 3: s += p1 + asr<7>( p1 * -13 ) - p2 + asr<4>( p2 * 3 ); break; // s += p1 * 0.8984375 - p2 * 0.40625 + } + + // Adjust and write sample + s = sclip<16>( sclamp<16>( s ) * 2 ); + pos [brr_buf_size] = pos [0] = s; // second copy simplifies wrap-around + } } -void bDSP::writew(uint16 addr, uint16 data) { - writeb(addr, data); - writeb(addr + 1, data >> 8); + +//// Voices + +#define VOICE_CLOCK( n ) void bDSP::voice_##n( voice_t* const v ) + +inline VOICE_CLOCK( V1 ) +{ + m.t_dir_addr = m.t_dir * 0x100 + m.t_srcn * 4; + m.t_srcn = VREG(v->regs,srcn); +} +inline VOICE_CLOCK( V2 ) +{ + // Read sample pointer (ignored if not needed) + uint8 const* entry = &ram [m.t_dir_addr]; + if ( !v->kon_delay ) + entry += 2; + m.t_brr_next_addr = entry [0] | entry [1] << 8; + + m.t_adsr0 = VREG(v->regs,adsr0); + + // Read pitch, spread over two clocks + m.t_pitch = VREG(v->regs,pitchl); +} +inline VOICE_CLOCK( V3a ) +{ + m.t_pitch += (VREG(v->regs,pitchh) & 0x3F) << 8; +} +inline VOICE_CLOCK( V3b ) +{ + // Read BRR header and byte + m.t_brr_byte = ram [(v->brr_addr + v->brr_offset) & 0xFFFF]; + m.t_brr_header = ram [v->brr_addr]; // brr_addr doesn't need masking +} +VOICE_CLOCK( V3c ) +{ + // Pitch modulation using previous voice's output + if ( m.t_pmon & v->vbit ) + m.t_pitch += asr<10>( asr<5>( m.t_output ) * m.t_pitch ); + + if ( v->kon_delay ) + { + // Get ready to start BRR decoding on next sample + if ( v->kon_delay == 5 ) + { + v->brr_addr = m.t_brr_next_addr; + v->brr_offset = 1; + v->buf_pos = 0; + m.t_brr_header = 0; // header is ignored on this sample + } + + // Envelope is never run during KON + v->env = 0; + v->hidden_env = 0; + + // Disable BRR decoding until last three samples + v->interp_pos = 0; + if ( --v->kon_delay & 3 ) + v->interp_pos = 0x4000; + + // Pitch is never added during KON + m.t_pitch = 0; + } + + // Gaussian interpolation + { + // Make pointers into gaussian based on fractional position between samples + int offset = v->interp_pos >> 4 & 0xFF; + short const* fwd = gauss + 255 - offset; + short const* rev = gauss + offset; // mirror left half of gaussian + + int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; + int out; + out = asr<11>( fwd [ 0] * in [0] ); + out += asr<11>( fwd [256] * in [1] ); + out += asr<11>( rev [256] * in [2] ); + out = sclip<16>( out ); + out += asr<11>( rev [ 0] * in [3] ); + + out = sclamp<16>( out ) & ~1; + + // Noise + if ( m.t_non & v->vbit ) + out = sclip<16>( m.noise * 2 ); + + // Apply envelope + m.t_output = asr<11>( out * v->env ) & ~1; + v->t_envx_out = (uint8) (v->env >> 4); + } + + // Immediate silence due to end of sample or soft reset + if ( REG(flg) & 0x80 || (m.t_brr_header & 3) == 1 ) + { + v->env_mode = env_release; + v->env = 0; + } + + if ( m.every_other_sample ) + { + // KOFF + if ( m.t_koff & v->vbit ) + v->env_mode = env_release; + + // KON + if ( m.kon & v->vbit ) + { + v->kon_delay = 5; + v->env_mode = env_attack; + } + } + + // Run envelope for next sample + if ( !v->kon_delay ) + run_envelope( v ); +} +inline void bDSP::voice_output( voice_t const* v, int ch ) +{ + // Apply left/right volume + int amp = asr<7>( m.t_output * (int8) VREG(v->regs,voll + ch) ); + + // Add to output total + m.t_main_out [ch] = sclamp<16>( m.t_main_out [ch] + amp ); + + // Optionally add to echo total + if ( m.t_eon & v->vbit ) + m.t_echo_out [ch] = sclamp<16>( m.t_echo_out [ch] + amp ); +} +VOICE_CLOCK( V4 ) +{ + // Decode BRR + m.t_looped = 0; + if ( v->interp_pos >= 0x4000 ) + { + decode_brr( v ); + + if ( (v->brr_offset += 2) >= brr_block_size ) + { + // Start decoding next BRR block + assert( v->brr_offset == brr_block_size ); + v->brr_addr = (v->brr_addr + brr_block_size) & 0xFFFF; + if ( m.t_brr_header & 1 ) + { + v->brr_addr = m.t_brr_next_addr; + m.t_looped = v->vbit; + } + v->brr_offset = 1; + } + } + + // Apply pitch + v->interp_pos = (v->interp_pos & 0x3FFF) + m.t_pitch; + + // Keep from getting too far ahead (when using pitch modulation) + if ( v->interp_pos > 0x7FFF ) + v->interp_pos = 0x7FFF; + + // Output left + voice_output( v, 0 ); +} +inline VOICE_CLOCK( V5 ) +{ + // Output right + voice_output( v, 1 ); + + // ENDX, OUTX, and ENVX won't update if you wrote to them 1-2 clocks earlier + int endx_buf = REG(endx) | m.t_looped; + + // Clear bit in ENDX if KON just began + if ( v->kon_delay == 5 ) + endx_buf &= ~v->vbit; + m.endx_buf = (uint8) endx_buf; +} +inline VOICE_CLOCK( V6 ) +{ + (void) v; // avoid compiler warning about unused v + m.outx_buf = (uint8) (m.t_output >> 8); +} +inline VOICE_CLOCK( V7 ) +{ + // Update ENDX + REG(endx) = m.endx_buf; + + m.envx_buf = v->t_envx_out; +} +inline VOICE_CLOCK( V8 ) +{ + // Update OUTX + VREG(v->regs,outx) = m.outx_buf; +} +inline VOICE_CLOCK( V9 ) +{ + // Update ENVX + VREG(v->regs,envx) = m.envx_buf; } -uint8 bDSP::read(uint8 addr) { - addr &= 127; -int v = addr >> 4; -int n = addr & 15; - - switch(addr) { - case 0x00: case 0x10: case 0x20: case 0x30: - case 0x40: case 0x50: case 0x60: case 0x70: - return voice[v].VOLL; - case 0x01: case 0x11: case 0x21: case 0x31: - case 0x41: case 0x51: case 0x61: case 0x71: - return voice[v].VOLR; - case 0x02: case 0x12: case 0x22: case 0x32: - case 0x42: case 0x52: case 0x62: case 0x72: - return voice[v].PITCH; - case 0x03: case 0x13: case 0x23: case 0x33: - case 0x43: case 0x53: case 0x63: case 0x73: - return voice[v].PITCH >> 8; - case 0x04: case 0x14: case 0x24: case 0x34: - case 0x44: case 0x54: case 0x64: case 0x74: - return voice[v].SRCN; - case 0x05: case 0x15: case 0x25: case 0x35: - case 0x45: case 0x55: case 0x65: case 0x75: - return voice[v].ADSR1; - case 0x06: case 0x16: case 0x26: case 0x36: - case 0x46: case 0x56: case 0x66: case 0x76: - return voice[v].ADSR2; - case 0x07: case 0x17: case 0x27: case 0x37: - case 0x47: case 0x57: case 0x67: case 0x77: - return voice[v].GAIN; - case 0x08: case 0x18: case 0x28: case 0x38: - case 0x48: case 0x58: case 0x68: case 0x78: - return voice[v].ENVX; - case 0x09: case 0x19: case 0x29: case 0x39: - case 0x49: case 0x59: case 0x69: case 0x79: - return voice[v].OUTX; - - case 0x0f: case 0x1f: case 0x2f: case 0x3f: - case 0x4f: case 0x5f: case 0x6f: case 0x7f: - return status.FIR[v]; - - case 0x0c: return status.MVOLL; - case 0x1c: return status.MVOLR; - case 0x2c: return status.EVOLL; - case 0x3c: return status.EVOLR; - case 0x4c: return status.KON; - case 0x5c: return status.KOFF; - case 0x6c: return status.FLG; - case 0x7c: return status.ENDX; - - case 0x0d: return status.EFB; - case 0x2d: return status.PMON; - case 0x3d: return status.NON; - case 0x4d: return status.EON; - case 0x5d: return status.DIR; - case 0x6d: return status.ESA; - case 0x7d: return status.EDL; - } - - return dspram[addr]; +// Most voices do all these in one clock, so make a handy composite +inline VOICE_CLOCK( V3 ) +{ + voice_V3a( v ); + voice_V3b( v ); + voice_V3c( v ); } -void bDSP::write(uint8 addr, uint8 data) { -//0x80-0xff is a read-only mirror of 0x00-0x7f - if(addr & 0x80)return; +// Common combinations of voice steps on different voices. This greatly reduces +// code size and allows everything to be inlined in these functions. +VOICE_CLOCK(V7_V4_V1) { voice_V7(v); voice_V1(v+3); voice_V4(v+1); } +VOICE_CLOCK(V8_V5_V2) { voice_V8(v); voice_V5(v+1); voice_V2(v+2); } +VOICE_CLOCK(V9_V6_V3) { voice_V9(v); voice_V6(v+1); voice_V3(v+2); } -int v = addr >> 4; -int n = addr & 15; - switch(addr) { - case 0x00: case 0x10: case 0x20: case 0x30: - case 0x40: case 0x50: case 0x60: case 0x70: - voice[v].VOLL = data; - break; - case 0x01: case 0x11: case 0x21: case 0x31: - case 0x41: case 0x51: case 0x61: case 0x71: - voice[v].VOLR = data; - break; - case 0x02: case 0x12: case 0x22: case 0x32: - case 0x42: case 0x52: case 0x62: case 0x72: - voice[v].PITCH &= 0xff00; - voice[v].PITCH |= data; - break; - case 0x03: case 0x13: case 0x23: case 0x33: - case 0x43: case 0x53: case 0x63: case 0x73: - voice[v].PITCH &= 0x00ff; - voice[v].PITCH |= data << 8; - break; - case 0x04: case 0x14: case 0x24: case 0x34: - case 0x44: case 0x54: case 0x64: case 0x74: - voice[v].SRCN = data; - break; - case 0x05: case 0x15: case 0x25: case 0x35: - case 0x45: case 0x55: case 0x65: case 0x75: - voice[v].ADSR1 = data; - voice[v].AdjustEnvelope(); - break; - case 0x06: case 0x16: case 0x26: case 0x36: - case 0x46: case 0x56: case 0x66: case 0x76: - voice[v].ADSR2 = data; - //sustain_level = 0-7, 7 is a special case handled by ATTACK envx mode - voice[v].env_sustain = (voice[v].ADSR_sus_level() + 1) << 8; - voice[v].AdjustEnvelope(); - break; - case 0x07: case 0x17: case 0x27: case 0x37: - case 0x47: case 0x57: case 0x67: case 0x77: - voice[v].GAIN = data; - voice[v].AdjustEnvelope(); - break; - case 0x08: case 0x18: case 0x28: case 0x38: - case 0x48: case 0x58: case 0x68: case 0x78: - voice[v].ENVX = data; - break; - case 0x09: case 0x19: case 0x29: case 0x39: - case 0x49: case 0x59: case 0x69: case 0x79: - voice[v].OUTX = data; - break; +//// Echo - case 0x0f: case 0x1f: case 0x2f: case 0x3f: - case 0x4f: case 0x5f: case 0x6f: case 0x7f: - status.FIR[v] = data; - break; +// Current echo buffer pointer for left/right channel +#define ECHO_PTR( ch ) (&ram [echo_ptr + ch * 2]) - case 0x0c: status.MVOLL = data; break; - case 0x1c: status.MVOLR = data; break; - case 0x2c: status.EVOLL = data; break; - case 0x3c: status.EVOLR = data; break; +// Sample in echo history buffer, where 0 is the oldest +#define ECHO_FIR( i ) (m.echo_hist [(m.echo_hist_pos + (i)) & (echo_hist_size - 1)]) - case 0x4c: - status.KON = data; - status.kon = data; - status.key_flag = true; - break; +// Calculate FIR point for left/right channel +#define CALC_FIR( i, ch ) asr<6>( ECHO_FIR( i + 1 ) [ch] * (int8) REG(fir + i * 0x10) ) - case 0x5c: - status.KOFF = data; - status.key_flag = true; - break; - - case 0x6c: - status.FLG = data; - status.key_flag = true; - status.noise_rate = RateTable[data & 0x1f]; - break; - - case 0x7c: - //read-only register, writes clear all bits of ENDX - status.ENDX = 0; - break; - - case 0x0d: status.EFB = data; break; - case 0x2d: status.PMON = data; break; - case 0x3d: status.NON = data; break; - case 0x4d: status.EON = data; break; - case 0x5d: status.DIR = data; break; - case 0x6d: status.ESA = data; break; - - case 0x7d: - status.EDL = data; - status.echo_size = (data & 0x0f) << 11; - break; - } - - dspram[addr] = data; +inline int get_echo_sample( void const* p ) +{ + return ((uint8 const*) p) [0] | + (( int8 const*) p) [1] << 8; } -void bDSP::power() { - spcram = r_smp->get_spcram_handle(); - memset(dspram, 0x00, 128); - - for(int v = 0; v < 8; v++) { - voice[v].VOLL = 0; - voice[v].VOLR = 0; - voice[v].PITCH = 0; - voice[v].SRCN = 0; - voice[v].ADSR1 = 0; - voice[v].ADSR2 = 0; - voice[v].GAIN = 0; - - status.FIR[v] = 0; - } - - status.MVOLL = status.MVOLR = 0; - status.EVOLL = status.EVOLR = 0; - status.ENDX = 0; - status.EFB = 0; - status.PMON = 0; - status.NON = 0; - status.EON = 0; - status.DIR = 0; - status.ESA = 0; - status.EDL = 0; - - status.echo_size = 0; - status.echo_target = 0; - - reset(); +inline void set_echo_sample( void* p, unsigned n ) +{ + ((uint8*) p) [0] = (uint8) n; + ((uint8*) p) [1] = (uint8) (n >> 8); } -void bDSP::reset() { - status.KON = 0x00; - status.KOFF = 0x00; - status.FLG |= 0xe0; - - status.kon = 0x00; - status.key_flag = false; - - status.noise_ctr = 0; - status.noise_rate = 0; - status.noise_sample = 0x4000; - - status.echo_index = 0; - status.fir_buffer_index = 0; - - for(int v = 0; v < 8; v++) { - voice[v].ENVX = 0; - voice[v].OUTX = 0; - - voice[v].pitch_ctr = 0; - - voice[v].brr_index = 0; - voice[v].brr_ptr = readw((status.DIR << 8) + (voice[v].SRCN << 2)); - voice[v].brr_looped = false; - voice[v].brr_data[0] = 0; - voice[v].brr_data[1] = 0; - voice[v].brr_data[2] = 0; - voice[v].brr_data[3] = 0; - voice[v].brr_data_index = 0; - - voice[v].envx = 0; - voice[v].env_ctr = 0; - voice[v].env_rate = 0; - voice[v].env_state = SILENCE; - voice[v].env_mode = DIRECT; - - status.fir_buffer[0][v] = 0; - status.fir_buffer[1][v] = 0; - } - - dsp_counter = 0; +inline int bDSP::calc_echo_output( int ch, int echo_in ) +{ + return sclamp<16>( + sclip<16>( asr<7>( m.t_main_out [ch] * (int8) REG(mvoll + ch * 0x10) ) ) + + sclip<16>( asr<7>( echo_in * (int8) REG(evoll + ch * 0x10) ) ) ); } -uint32 bDSP::run() { -uint8 pmon; -int32 sample; -int32 msamplel, msampler; -int32 esamplel, esampler; -int32 fir_samplel, fir_sampler; - pmon = status.PMON & ~status.NON & ~1; - if(!(dsp_counter++ & 1) && status.key_flag) { - for(int v = 0; v < 8; v++) { - uint8 mask = 1 << v; - if(status.soft_reset()) { - if(voice[v].env_state != SILENCE) { - voice[v].env_state = SILENCE; - voice[v].AdjustEnvelope(); - } - } else if(status.KOFF & mask) { - if(voice[v].env_state != SILENCE && voice[v].env_state != RELEASE) { - voice[v].env_state = RELEASE; - voice[v].AdjustEnvelope(); - } - } else if(status.kon & mask) { - status.ENDX &= ~mask; - status.kon &= ~mask; +//// Timing - voice[v].brr_ptr = readw((status.DIR << 8) + (voice[v].SRCN << 2)); - voice[v].brr_index = -9; - voice[v].brr_looped = false; - voice[v].brr_data[0] = 0; - voice[v].brr_data[1] = 0; - voice[v].brr_data[2] = 0; - voice[v].brr_data[3] = 0; - voice[v].envx = 0; - voice[v].env_state = ATTACK; - voice[v].AdjustEnvelope(); - } - } - status.key_flag = false; - } +void bDSP::enter() +{ + int t_esa = REG(esa); + + while ( 1 ) + { + // n is currently ignored + #define NEXT_CLOCK( n ) \ + scheduler.addclocks_dsp( 3 ); + + // Execute clock for a particular voice + #define V( clock, voice ) voice_##clock( &m.voices [voice] ); -//update noise - status.noise_ctr += status.noise_rate; - if(status.noise_ctr >= 0x7800) { - status.noise_ctr -= 0x7800; - status.noise_sample = (status.noise_sample >> 1) | - (((status.noise_sample << 14) ^ (status.noise_sample << 13)) & 0x4000); - } + /* The most common sequence of clocks uses composite operations + for efficiency. For example, the following are equivalent to the + individual steps on the right: - msamplel = msampler = 0; - esamplel = esampler = 0; + V(V7_V4_V1,2) -> V(V7,2) V(V4,3) V(V1,5) + V(V8_V5_V2,2) -> V(V8,2) V(V5,3) V(V2,4) + V(V9_V6_V3,2) -> V(V9,2) V(V6,3) V(V3,4) */ + + NEXT_CLOCK( 0) V(V5,0)V(V2,1) + NEXT_CLOCK( 1) V(V6,0)V(V3,1) + NEXT_CLOCK( 2) V(V7_V4_V1,0) + NEXT_CLOCK( 3) V(V8_V5_V2,0) + NEXT_CLOCK( 4) V(V9_V6_V3,0) + NEXT_CLOCK( 5) V(V7_V4_V1,1) + NEXT_CLOCK( 6) V(V8_V5_V2,1) + NEXT_CLOCK( 7) V(V9_V6_V3,1) + NEXT_CLOCK( 8) V(V7_V4_V1,2) + NEXT_CLOCK( 9) V(V8_V5_V2,2) + NEXT_CLOCK(10) V(V9_V6_V3,2) + NEXT_CLOCK(11) V(V7_V4_V1,3) + NEXT_CLOCK(12) V(V8_V5_V2,3) + NEXT_CLOCK(13) V(V9_V6_V3,3) + NEXT_CLOCK(14) V(V7_V4_V1,4) + NEXT_CLOCK(15) V(V8_V5_V2,4) + NEXT_CLOCK(16) V(V9_V6_V3,4) + NEXT_CLOCK(17) V(V1,0) V(V7,5)V(V4,6) + NEXT_CLOCK(18) V(V8_V5_V2,5) + NEXT_CLOCK(19) V(V9_V6_V3,5) + NEXT_CLOCK(20) V(V1,1) V(V7,6)V(V4,7) + NEXT_CLOCK(21) V(V8,6)V(V5,7) V(V2,0) /* t_brr_next_addr order dependency */ + NEXT_CLOCK(22) V(V3a,0) V(V9,6)V(V6,7) + + // History + if ( ++m.echo_hist_pos >= echo_hist_size ) + m.echo_hist_pos = 0; + + int const echo_ptr = (t_esa * 0x100 + m.echo_offset) & 0xFFFF; + + // FIR + int echo_in_l = CALC_FIR( 0, 0 ); + int echo_in_r = CALC_FIR( 0, 1 ); + + ECHO_FIR( 0 ) [0] = asr<1>( get_echo_sample( ECHO_PTR( 0 ) ) ); + + NEXT_CLOCK(23) V(V7,7) + + echo_in_l += CALC_FIR( 1, 0 ) + CALC_FIR( 2, 0 ); + echo_in_r += CALC_FIR( 1, 1 ) + CALC_FIR( 2, 1 ); + + ECHO_FIR( 0 ) [1] = asr<1>( get_echo_sample( ECHO_PTR( 1 ) ) ); + + NEXT_CLOCK(24) V(V8,7) + + echo_in_l += CALC_FIR( 3, 0 ) + CALC_FIR( 4, 0 ) + CALC_FIR( 5, 0 ); + echo_in_r += CALC_FIR( 3, 1 ) + CALC_FIR( 4, 1 ) + CALC_FIR( 5, 1 ); + + NEXT_CLOCK(25) V(V3b,0) V(V9,7) + + echo_in_l = sclip<16>( echo_in_l + CALC_FIR( 6, 0 ) ) + sclip<16>( CALC_FIR( 7, 0 ) ); + echo_in_r = sclip<16>( echo_in_r + CALC_FIR( 6, 1 ) ) + sclip<16>( CALC_FIR( 7, 1 ) ); + + echo_in_l = sclamp<16>( echo_in_l ) & ~1; + echo_in_r = sclamp<16>( echo_in_r ) & ~1; + + NEXT_CLOCK(26) - for(int v = 0; v < 8; v++) { - if(voice[v].brr_index < -1) { - voice[v].brr_index++; - voice[v].OUTX = voice[v].outx = 0; - voice[v].ENVX = 0; - continue; - } - - if(voice[v].brr_index >= 0) { - if(pmon & (1 << v)) { - voice[v].pitch_ctr += (voice[v].pitch_rate() * (voice[v - 1].outx + 0x8000)) >> 15; - } else { - voice[v].pitch_ctr += voice[v].pitch_rate(); - } - } else { - voice[v].pitch_ctr = 0x3000; - voice[v].brr_index = 0; - } - - //decode BRR samples - while(voice[v].pitch_ctr >= 0) { - voice[v].pitch_ctr -= 0x1000; - - voice[v].brr_data_index++; - voice[v].brr_data_index &= 3; - - if(voice[v].brr_index == 0) { - voice[v].brr_header = readb(voice[v].brr_ptr); - - if(voice[v].brr_header_flags() == BRR_END) { - status.ENDX |= (1 << v); - voice[v].env_state = SILENCE; - voice[v].AdjustEnvelope(); - } - } - -#define S(x) voice[v].brr_data[(voice[v].brr_data_index + (x)) & 3] - if(voice[v].env_state != SILENCE) { - sample = readb(voice[v].brr_ptr + 1 + (voice[v].brr_index >> 1)); - if(voice[v].brr_index & 1) { - sample = sclip<4>(sample); - } else { - sample = sclip<4>(sample >> 4); - } - - if(voice[v].brr_header_shift() <= 12) { - sample = (sample << voice[v].brr_header_shift() >> 1); - } else { - sample &= ~0x7ff; - } - - switch(voice[v].brr_header_filter()) { - case 0: //direct - break; - case 1: //15/16 - sample += S(-1) + ((-S(-1)) >> 4); - break; - case 2: //61/32 - 15/16 - sample += (S(-1) << 1) + ((-((S(-1) << 1) + S(-1))) >> 5) - - S(-2) + (S(-2) >> 4); - break; - case 3: //115/64 - 13/16 - sample += (S(-1) << 1) + ((-(S(-1) + (S(-1) << 2) + (S(-1) << 3))) >> 6) - - S(-2) + (((S(-2) << 1) + S(-2)) >> 4); - break; - } - - S(0) = sample = sclip<15>(sclamp<16>(sample)); - } else { - S(0) = sample = 0; - } - - if(++voice[v].brr_index > 15) { - voice[v].brr_index = 0; - if(voice[v].brr_header_flags() & BRR_END) { - if(voice[v].brr_header_flags() & BRR_LOOP) { - status.ENDX |= (1 << v); - } - voice[v].brr_ptr = readw((status.DIR << 8) + (voice[v].SRCN << 2) + 2); - voice[v].brr_looped = true; - } else { - voice[v].brr_ptr += 9; - } - } - } - - //volume envelope adjust - voice[v].env_ctr += voice[v].env_rate; - - if(voice[v].env_ctr >= 0x7800) { - voice[v].env_ctr -= 0x7800; - switch(voice[v].env_mode) { - case DIRECT: - voice[v].env_rate = 0; - break; - case LINEAR_DEC: - voice[v].envx -= 32; - if(voice[v].envx <= 0) { - voice[v].envx = 0; - voice[v].env_rate = 0; - voice[v].env_mode = DIRECT; - } - break; - case LINEAR_INC: - voice[v].envx += 32; - if(voice[v].envx >= 0x7ff) { - voice[v].envx = 0x7ff; - voice[v].env_rate = 0; - voice[v].env_mode = DIRECT; - if(voice[v].ADSR_enabled() && voice[v].env_state == ATTACK) { - voice[v].env_state = ((voice[v].env_sustain == 0x800) ? SUSTAIN : DECAY); - voice[v].AdjustEnvelope(); - } - } - break; - case EXP_DEC: - //multiply by 255/256ths - voice[v].envx -= ((voice[v].envx - 1) >> 8) + 1; - if(voice[v].ADSR_enabled() && voice[v].env_state == DECAY && voice[v].envx <= voice[v].env_sustain) { - voice[v].env_state = SUSTAIN; - voice[v].AdjustEnvelope(); - } else if(voice[v].envx <= 0) { - voice[v].envx = 0; - voice[v].env_rate = 0; - voice[v].env_mode = DIRECT; - } - break; - case BENT_INC: - if(voice[v].envx < 0x600) { - voice[v].envx += 32; - } else { - voice[v].envx += 8; - - if(voice[v].envx >= 0x7ff) { - voice[v].envx = 0x7ff; - voice[v].env_rate = 0; - voice[v].env_mode = DIRECT; - } - } - break; - case FAST_ATTACK: - voice[v].envx += 0x400; - if(voice[v].envx >= 0x7ff) { - voice[v].envx = 0x7ff; - - //attack raises to max envx. if sustain is also set to max envx, skip decay phase - voice[v].env_state = ((voice[v].env_sustain == 0x800) ? SUSTAIN : DECAY); - voice[v].AdjustEnvelope(); - } - break; - case RELEASE_DEC: - voice[v].envx -= 8; - if(voice[v].envx <= 0) { - voice[v].env_state = SILENCE; - voice[v].AdjustEnvelope(); - } - break; - } - } - - voice[v].ENVX = voice[v].envx >> 4; - - //gaussian interpolation / noise - if(status.NON & (1 << v)) { - sample = sclip<15>(status.noise_sample); - } else { - int32 d = voice[v].pitch_ctr >> 4; //-256 <= sample <= -1 - sample = ((GaussTable[ -1-d] * S(-3)) >> 11); - sample += ((GaussTable[255-d] * S(-2)) >> 11); - sample += ((GaussTable[512+d] * S(-1)) >> 11); - sample = sclip <15>(sample); - sample += ((GaussTable[256+d] * S( 0)) >> 11); - sample = sclamp<15>(sample); - } -#undef S - - //envelope / volume adjust - sample = (sample * voice[v].envx) >> 11; - voice[v].outx = sample << 1; - voice[v].OUTX = sample >> 7; - - if(!status.mute()) { - msamplel += ((sample * voice[v].VOLL) >> 7) << 1; - msampler += ((sample * voice[v].VOLR) >> 7) << 1; - } - - if((status.EON & (1 << v)) && status.echo_write()) { - esamplel += ((sample * voice[v].VOLL) >> 7) << 1; - esampler += ((sample * voice[v].VOLR) >> 7) << 1; - } - } - -//echo (FIR) adjust -#define F(c,x) status.fir_buffer[c][(status.fir_buffer_index+(x)) & 7] - status.fir_buffer_index++; - F(0,0) = readw((status.ESA << 8) + status.echo_index); - F(1,0) = readw((status.ESA << 8) + status.echo_index + 2); - - fir_samplel = (F(0,-0) * status.FIR[7] + - F(0,-1) * status.FIR[6] + - F(0,-2) * status.FIR[5] + - F(0,-3) * status.FIR[4] + - F(0,-4) * status.FIR[3] + - F(0,-5) * status.FIR[2] + - F(0,-6) * status.FIR[1] + - F(0,-7) * status.FIR[0]); - - fir_sampler = (F(1,-0) * status.FIR[7] + - F(1,-1) * status.FIR[6] + - F(1,-2) * status.FIR[5] + - F(1,-3) * status.FIR[4] + - F(1,-4) * status.FIR[3] + - F(1,-5) * status.FIR[2] + - F(1,-6) * status.FIR[1] + - F(1,-7) * status.FIR[0]); -#undef F - -//update echo buffer - if(status.echo_write()) { - esamplel += (fir_samplel * status.EFB) >> 14; - esampler += (fir_sampler * status.EFB) >> 14; - - esamplel = sclamp<16>(esamplel); - esampler = sclamp<16>(esampler); - - writew((status.ESA << 8) + status.echo_index, esamplel); - writew((status.ESA << 8) + status.echo_index + 2, esampler); - } - - status.echo_index += 4; - if(status.echo_index >= status.echo_target) { - status.echo_index = 0; - status.echo_target = status.echo_size; - } - -//main output adjust - if(!status.mute()) { - msamplel = (msamplel * status.MVOLL) >> 7; - msampler = (msampler * status.MVOLR) >> 7; - - msamplel += (fir_samplel * status.EVOLL) >> 14; - msampler += (fir_sampler * status.EVOLR) >> 14; - - msamplel = sclamp<16>(msamplel); - msampler = sclamp<16>(msampler); - } - - return (uint32)( (uint16)msamplel | ((uint16)msampler << 16) ); + // Echo feedback + int echo_out_l = m.t_echo_out [0] + sclip<16>( asr<7>( echo_in_l * (int8) REG(efb) ) ); + int echo_out_r = m.t_echo_out [1] + sclip<16>( asr<7>( echo_in_r * (int8) REG(efb) ) ); + + echo_out_l = sclamp<16>( echo_out_l ) & ~1; + echo_out_r = sclamp<16>( echo_out_r ) & ~1; + + // Output + int main_out_l = calc_echo_output( 0, echo_in_l ); + + NEXT_CLOCK(27) + + int main_out_r = calc_echo_output( 1, echo_in_r ); + + // TODO: global muting isn't this simple (turns DAC on and off + // or something, causing small ~37-sample pulse when first muted) + if ( REG(flg) & 0x40 ) + { + main_out_l = 0; + main_out_r = 0; + } + + // Output sample to DAC + snes.audio_update( main_out_l, main_out_r ); + + m.t_main_out [0] = 0; + m.t_main_out [1] = 0; + + m.t_pmon = REG(pmon) & 0xFE; // voice 0 doesn't support PMON + + NEXT_CLOCK(28) + + m.t_non = REG(non); + m.t_eon = REG(eon); + m.t_dir = REG(dir); + + int echo_disabled = REG(flg); + + NEXT_CLOCK(29) + + // Write left echo + if ( !(echo_disabled & 0x20) ) + set_echo_sample( ECHO_PTR( 0 ), echo_out_l ); + m.t_echo_out [0] = 0; + + t_esa = REG(esa); + + if ( !m.echo_offset ) + m.echo_length = (REG(edl) & 0x0F) * 0x800; + + m.echo_offset += 4; + if ( m.echo_offset >= m.echo_length ) + m.echo_offset = 0; + + if ( (m.every_other_sample ^= 1) != 0 ) + m.new_kon &= ~m.kon; // clears KON 63 clocks after it was last read + + echo_disabled = REG(flg); + + NEXT_CLOCK(30) + + // Write right echo + if ( !(echo_disabled & 0x20) ) + set_echo_sample( ECHO_PTR( 1 ), echo_out_r ); + m.t_echo_out [1] = 0; + + if ( m.every_other_sample ) + { + m.kon = m.new_kon; + m.t_koff = REG(koff); + } + + if ( --m.counter < 0 ) + m.counter = simple_counter_range - 1; + + // Noise + if ( !read_counter( REG(flg) & 0x1F ) ) + { + int feedback = (m.noise << 13) ^ (m.noise << 14); + m.noise = (feedback & 0x4000) ^ (m.noise >> 1); + } + + V(V3c,0) + + NEXT_CLOCK(31) V(V4,0) V(V1,2) + } } -bDSP::bDSP() {} -bDSP::~bDSP() {} + +//// Setup + +bDSP::bDSP() { } + +bDSP::~bDSP() { } + +void bDSP::reset() +{ + REG(flg) = 0xE0; + + m.noise = 0x4000; + m.echo_hist_pos = 0; + m.every_other_sample = 1; + m.echo_offset = 0; + m.counter = 0; +} + +static uint8 const initial_regs [bDSP::register_count] = +{ + 0x45,0x8B,0x5A,0x9A,0xE4,0x82,0x1B,0x78,0x00,0x00,0xAA,0x96,0x89,0x0E,0xE0,0x80, + 0x2A,0x49,0x3D,0xBA,0x14,0xA0,0xAC,0xC5,0x00,0x00,0x51,0xBB,0x9C,0x4E,0x7B,0xFF, + 0xF4,0xFD,0x57,0x32,0x37,0xD9,0x42,0x22,0x00,0x00,0x5B,0x3C,0x9F,0x1B,0x87,0x9A, + 0x6F,0x27,0xAF,0x7B,0xE5,0x68,0x0A,0xD9,0x00,0x00,0x9A,0xC5,0x9C,0x4E,0x7B,0xFF, + 0xEA,0x21,0x78,0x4F,0xDD,0xED,0x24,0x14,0x00,0x00,0x77,0xB1,0xD1,0x36,0xC1,0x67, + 0x52,0x57,0x46,0x3D,0x59,0xF4,0x87,0xA4,0x00,0x00,0x7E,0x44,0x9C,0x4E,0x7B,0xFF, + 0x75,0xF5,0x06,0x97,0x10,0xC3,0x24,0xBB,0x00,0x00,0x7B,0x7A,0xE0,0x60,0x12,0x0F, + 0xF7,0x74,0x1C,0xE5,0x39,0x3D,0x73,0xC1,0x00,0x00,0x7A,0xB3,0xFF,0x4E,0x7B,0xFF +}; + +void bDSP::power() +{ + ram = (uint8*) r_smp->get_spcram_handle(); + memset( &m, 0, sizeof m ); + memcpy( m.regs, initial_regs, sizeof m.regs ); + + // Internal state + for ( int i = voice_count; --i >= 0; ) + { + voice_t* v = &m.voices [i]; + v->brr_offset = 1; + v->vbit = 1 << i; + v->regs = &m.regs [i * 0x10]; + } + m.new_kon = REG(kon); + m.t_dir = REG(dir); + + reset(); +} diff --git a/src/dsp/bdsp/bdsp.h b/src/dsp/bdsp/bdsp.h index 3570827b..0ff7a5e0 100644 --- a/src/dsp/bdsp/bdsp.h +++ b/src/dsp/bdsp/bdsp.h @@ -1,171 +1,167 @@ class bDSP : public DSP { -private: -uint8 dspram[128]; -uint8 *spcram; - -uint32 dsp_counter; - -enum { BRR_END = 1, BRR_LOOP = 2 }; - -uint8 readb (uint16 addr); -uint16 readw (uint16 addr); -void writeb(uint16 addr, uint8 data); -void writew(uint16 addr, uint16 data); - public: -static const uint16 RateTable[32]; -static const int16 GaussTable[512]; - -enum EnvelopeStates { - ATTACK, - DECAY, - SUSTAIN, - RELEASE, - SILENCE -}; - -enum EnvelopeModes { - DIRECT, - LINEAR_DEC, - EXP_DEC, - LINEAR_INC, - BENT_INC, - - FAST_ATTACK, - RELEASE_DEC -}; - -private: -struct Status { -//$0c,$1c - int8 MVOLL, MVOLR; -//$2c,$3c - int8 EVOLL, EVOLR; -//$4c,$5c - uint8 KON, KOFF; -//$6c - uint8 FLG; -//$7c - uint8 ENDX; -//$0d - int8 EFB; -//$2d,$3d,$4d - uint8 PMON, NON, EON; -//$5d - uint8 DIR; -//$6d,$7d - uint8 ESA, EDL; - -//$xf - int8 FIR[8]; - -//internal variables - uint8 kon; - bool key_flag; - - int16 noise_ctr, noise_rate; - uint16 noise_sample; - - uint16 echo_index, echo_size, echo_target; - int16 fir_buffer[2][8]; - uint8 fir_buffer_index; - -//functions - bool soft_reset() { return bool(FLG & 0x80); } - bool mute() { return bool(FLG & 0x40); } - bool echo_write() { return !(FLG & 0x20); } -} status; - -struct Voice { -//$x0-$x1 - int8 VOLL, VOLR; -//$x2-$x3 - int16 PITCH; -//$x4 - uint8 SRCN; -//$x5-$x7 - uint8 ADSR1, ADSR2, GAIN; -//$x8-$x9 - uint8 ENVX, OUTX; - -//internal variables - int16 pitch_ctr; - - int8 brr_index; - uint16 brr_ptr; - uint8 brr_header; - bool brr_looped; - - int16 brr_data[4]; - uint8 brr_data_index; - - int16 envx; - uint16 env_ctr, env_rate, env_sustain; - enum EnvelopeStates env_state; - enum EnvelopeModes env_mode; - - int16 outx; - -//functions - int16 pitch_rate() { return PITCH & 0x3fff; } - - uint8 brr_header_shift() { return brr_header >> 4; } - uint8 brr_header_filter() { return (brr_header >> 2) & 3; } - uint8 brr_header_flags() { return brr_header & 3; } - - bool ADSR_enabled() { return bool(ADSR1 & 0x80); } - uint8 ADSR_decay() { return (ADSR1 >> 4) & 7; } - uint8 ADSR_attack() { return ADSR1 & 15; } - uint8 ADSR_sus_level() { return ADSR2 >> 5; } - uint8 ADSR_sus_rate() { return ADSR2 & 31; } - - void AdjustEnvelope() { - if(env_state == SILENCE) { - env_mode = DIRECT; - env_rate = 0; - envx = 0; - } else if(env_state == RELEASE) { - env_mode = RELEASE_DEC; - env_rate = 0x7800; - } else if(ADSR_enabled()) { - switch(env_state) { - case ATTACK: - env_rate = RateTable[(ADSR_attack() << 1) + 1]; - env_mode = (env_rate == 0x7800) ? FAST_ATTACK : LINEAR_INC; - break; - case DECAY: - env_rate = RateTable[(ADSR_decay() << 1) + 0x10]; - env_mode = EXP_DEC; - break; - case SUSTAIN: - env_rate = RateTable[ADSR_sus_rate()]; - env_mode = (env_rate == 0) ? DIRECT : EXP_DEC; - break; - } - } else if(GAIN & 0x80) { - switch(GAIN & 0x60) { - case 0x00: env_mode = LINEAR_DEC; break; - case 0x20: env_mode = EXP_DEC; break; - case 0x40: env_mode = LINEAR_INC; break; - case 0x60: env_mode = BENT_INC; break; - } - env_rate = RateTable[GAIN & 0x1f]; - } else { - env_mode = DIRECT; - env_rate = 0; - envx = (GAIN & 0x7f) << 4; - } - } -} voice[8]; + void enter(); + + uint8 read( uint8 addr ); + void write( uint8 addr, uint8 data ); + void power(); + void reset(); + + bDSP(); + ~bDSP(); + public: - uint8 read (uint8 addr); - void write(uint8 addr, uint8 data); - void power(); - void reset(); - uint32 run(); + enum { echo_hist_size = 8 }; + enum { register_count = 128 }; + enum { voice_count = 8 }; + + enum env_mode_t { env_release, env_attack, env_decay, env_sustain }; + enum { brr_buf_size = 12 }; + struct voice_t + { + int buf [brr_buf_size*2];// decoded samples (twice the size to simplify wrap handling) + int buf_pos; // place in buffer where next samples will be decoded + int interp_pos; // relative fractional position in sample (0x1000 = 1.0) + int brr_addr; // address of current BRR block + int brr_offset; // current decoding offset in BRR block + uint8* regs; // pointer to voice's DSP registers + int vbit; // bitmask for voice: 0x01 for voice 0, 0x02 for voice 1, etc. + int kon_delay; // KON delay/current setup phase + env_mode_t env_mode; + int env; // current envelope level + int hidden_env; // used by GAIN mode 7, very obscure quirk + uint8 t_envx_out; + }; +private: + + struct state_t + { + uint8 regs [register_count]; + + // Echo history keeps most recent 8 samples + int echo_hist [echo_hist_size] [2]; + int echo_hist_pos; + + int every_other_sample; // toggles every sample + int kon; // KON value when last checked + int noise; + int counter; + int echo_offset; // offset from ESA in echo buffer + int echo_length; // number of bytes that echo_offset will stop at + + // Hidden registers also written to when main register is written to + int new_kon; + uint8 endx_buf; + uint8 envx_buf; + uint8 outx_buf; + + // Temporary state between clocks + + // read once per sample + int t_pmon; + int t_non; + int t_eon; + int t_dir; + int t_koff; + + // read a few clocks ahead then used + int t_brr_next_addr; + int t_adsr0; + int t_brr_header; + int t_brr_byte; + int t_srcn; + + // internal state that is recalculated every sample + int t_dir_addr; + int t_pitch; + int t_output; + int t_looped; + + // left/right sums + int t_main_out [2]; + int t_echo_out [2]; + + voice_t voices [voice_count]; + }; + state_t m; + uint8* ram; + + unsigned read_counter( int rate ); + + void run_envelope( voice_t* const v ); + void decode_brr( voice_t* v ); - bDSP(); - ~bDSP(); + void voice_output( voice_t const* v, int ch ); + void voice_V1( voice_t* const ); + void voice_V2( voice_t* const ); + void voice_V3( voice_t* const ); + void voice_V3a( voice_t* const ); + void voice_V3b( voice_t* const ); + void voice_V3c( voice_t* const ); + void voice_V4( voice_t* const ); + void voice_V5( voice_t* const ); + void voice_V6( voice_t* const ); + void voice_V7( voice_t* const ); + void voice_V8( voice_t* const ); + void voice_V9( voice_t* const ); + void voice_V7_V4_V1( voice_t* const ); + void voice_V8_V5_V2( voice_t* const ); + void voice_V9_V6_V3( voice_t* const ); + + int calc_echo_output( int ch, int sample ); + + // Global registers + enum { + r_mvoll = 0x0C, r_mvolr = 0x1C, + r_evoll = 0x2C, r_evolr = 0x3C, + r_kon = 0x4C, r_koff = 0x5C, + r_flg = 0x6C, r_endx = 0x7C, + r_efb = 0x0D, r_pmon = 0x2D, + r_non = 0x3D, r_eon = 0x4D, + r_dir = 0x5D, r_esa = 0x6D, + r_edl = 0x7D, + r_fir = 0x0F // 8 coefficients at 0x0F, 0x1F ... 0x7F + }; + + // Voice registers + enum { + v_voll = 0x00, v_volr = 0x01, + v_pitchl = 0x02, v_pitchh = 0x03, + v_srcn = 0x04, v_adsr0 = 0x05, + v_adsr1 = 0x06, v_gain = 0x07, + v_envx = 0x08, v_outx = 0x09 + }; }; + +inline uint8 bDSP::read( uint8 addr ) +{ + return m.regs [addr]; +} + +inline void bDSP::write( uint8 addr, uint8 data ) +{ + m.regs [addr] = data; + switch ( addr & 0x0F ) + { + case v_envx: + m.envx_buf = data; + break; + + case v_outx: + m.outx_buf = data; + break; + + case 0x0C: + if ( addr == r_kon ) + m.new_kon = data; + + if ( addr == r_endx ) // always cleared, regardless of data written + { + m.endx_buf = 0; + m.regs [r_endx] = 0; + } + break; + } +} diff --git a/src/dsp/bdsp_official/bdsp.cpp b/src/dsp/bdsp_official/bdsp.cpp new file mode 100644 index 00000000..f5d0bd0c --- /dev/null +++ b/src/dsp/bdsp_official/bdsp.cpp @@ -0,0 +1,32 @@ +#include "../../base.h" +#include "spc_dsp.h" + +void bDSP::power() { + spc_dsp_init(r_smp->get_spcram_handle()); + spc_dsp_reset(); +} + +void bDSP::reset() { + spc_dsp_soft_reset(); +} + +uint8 bDSP::read(uint8 addr) { + return spc_dsp_read(addr); +} + +void bDSP::write(uint8 addr, uint8 data) { + spc_dsp_write(addr, data); +} + +#define SPC_DSP_CUSTOM_RUN 1 //causes spc_dsp_run() to not be defined since it's huge and we don't need it +#define SPC_DSP_OUT_HOOK(left, right) snes.audio_update(left, right); +#include "spc_dsp.cpp" + +void bDSP::enter() { loop: +#define PHASE(n) scheduler.addclocks_dsp(3); +#include "spc_dsp_timing.h" + goto loop; +} + +bDSP::bDSP() {} +bDSP::~bDSP() {} diff --git a/src/dsp/bdsp_official/bdsp.h b/src/dsp/bdsp_official/bdsp.h new file mode 100644 index 00000000..645efaec --- /dev/null +++ b/src/dsp/bdsp_official/bdsp.h @@ -0,0 +1,10 @@ +class bDSP : public DSP { public: + void enter(); + uint8 read(uint8 addr); + void write(uint8 addr, uint8 data); + void power(); + void reset(); + + bDSP(); + ~bDSP(); +}; diff --git a/src/dsp/bdsp_official/readme.txt b/src/dsp/bdsp_official/readme.txt new file mode 100644 index 00000000..b080d1a8 --- /dev/null +++ b/src/dsp/bdsp_official/readme.txt @@ -0,0 +1,64 @@ +Overall operation +----------------- +This DSP emulator fundamentally emulates the different options the DSP +performs on each clock. The pattern of operations repeats every 32 +clocks (except one minor detail, which repeats every 64 clocks instead). +There are three main types of operations: + +- Miscellaneous processing +- Voice processing +- Echo processing + +Each is done over several clocks, and several operations are done on +each clock. Each clock is defined as a separate function, then called +from a large switch block in a loop. + +Many times a value is read on one clock but not used until a later +clock, so many non-local temporary variables are used in the code to +store these values. These are named with t_ to make it clear that they +don't store long-term state. + + +Circular buffers +---------------- +Two circular buffers are used in the code (echo history and BRR decode). +Both need efficient index-based access with wrap-around. Things are +greatly simplified by repeating the contents of buffer twice, so instead +of + + 0 1 2 3 4 5 6 7 + +it stores + + 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 + +The position in this case would always be 0 to 7, so reading up to +8 +won't go outside buffer. This duplication is maintained by simply +writing data twice when filling buffer: + + 0 1 2 3 4 # 6 7 0 1 2 3 4 # 6 7 +new data -----^---------------^ + +No wrap checking needs to be done when writing either, since the above +reasoning holds. When making a state snapshot, only the first copy needs +to be saved. When restoring, simply duplicate the data twice. + + +Code +---- +- Currently all state is in static variables. They have either a t_ or +m_ prefix to allow easy migration to a structure. + +- Static state that persists over several samples or more is prefixed +with m_. + +- State which is temporary to the current sample is prefixed with t_. +These are usually just overwritten with new data on the next sample. +These generally correspond to temporaries/registers in actual DSP +itself. + +- Minimal stdint.h included in case your system doesn't have one. + + +-- +Shay Green diff --git a/src/dsp/bdsp_official/spc_dsp.cpp b/src/dsp/bdsp_official/spc_dsp.cpp new file mode 100644 index 00000000..83715d89 --- /dev/null +++ b/src/dsp/bdsp_official/spc_dsp.cpp @@ -0,0 +1,828 @@ +// http://www.slack.net/~ant/ + +#include "spc_dsp.h" + +#include +#include + +/* Copyright (C) 2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +// Volume registers and efb are signed! Easy to forget int8_t cast. +// Prefixes are to avoid accidental use of locals with same names. + +// Global registers +enum { + r_mvoll = 0x0C, r_mvolr = 0x1C, + r_evoll = 0x2C, r_evolr = 0x3C, + r_kon = 0x4C, r_koff = 0x5C, + r_flg = 0x6C, r_endx = 0x7C, + r_efb = 0x0D, r_pmon = 0x2D, + r_non = 0x3D, r_eon = 0x4D, + r_dir = 0x5D, r_esa = 0x6D, + r_edl = 0x7D, + r_fir = 0x0F // 8 coefficients at 0x0F, 0x1F ... 0x7F +}; + +// Voice registers +enum { + v_voll = 0x00, v_volr = 0x01, + v_pitchl = 0x02, v_pitchh = 0x03, + v_srcn = 0x04, v_adsr0 = 0x05, + v_adsr1 = 0x06, v_gain = 0x07, + v_envx = 0x08, v_outx = 0x09 +}; + +// Internal envelope modes +enum env_mode_t { env_release, env_attack, env_decay, env_sustain }; + +// Internal voice state +enum { brr_buf_size = 12 }; +enum { brr_block_size = 9 }; +typedef struct voice_t +{ + int buf [brr_buf_size*2];// decoded samples (twice the size to simplify wrap handling) + int buf_pos; // place in buffer where next samples will be decoded + int interp_pos; // relative fractional position in sample (0x1000 = 1.0) + int brr_addr; // address of current BRR block + int brr_offset; // current decoding offset in BRR block + uint8_t* regs; // pointer to voice's DSP registers + int vbit; // bitmask for voice: 0x01 for voice 0, 0x02 for voice 1, etc. + int kon_delay; // KON delay/current setup phase + enum env_mode_t env_mode; + int env; // current envelope level + int t_envx_out; + int hidden_env; // used by GAIN mode 7, very obscure quirk +} voice_t; + +static voice_t m_voice_state [spc_dsp_voice_count]; +static uint8_t* m_ram; // 64K shared RAM between DSP and SMP +spc_dsp_t m_spc_dsp; +spc_dsp_sample_t* m_spc_dsp_out_begin; +spc_dsp_sample_t* m_spc_dsp_out; +spc_dsp_sample_t* m_spc_dsp_out_end; + +// "Member" access +#define m m_spc_dsp + +// Access global DSP register +#define REG(n) m.regs [r_##n] + +// Access voice DSP register +#define VREG(r,n) r [v_##n] + +// if ( io < -32768 ) io = -32768; +// if ( io > 32767 ) io = 32767; +#define CLAMP16( io )\ +{\ + if ( (int16_t) io != io )\ + io = 0x7FFF ^ (io >> 31);\ +} + +// Gaussian interpolation + +static short const gauss [512] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, + 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27, + 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, + 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102, + 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132, + 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168, + 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210, + 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, + 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311, + 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370, + 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434, + 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504, + 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577, + 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654, + 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732, + 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811, + 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889, + 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965, + 969, 974, 978, 983, 988, 992, 997,1001,1005,1010,1014,1019,1023,1027,1032,1036, +1040,1045,1049,1053,1057,1061,1066,1070,1074,1078,1082,1086,1090,1094,1098,1102, +1106,1109,1113,1117,1121,1125,1128,1132,1136,1139,1143,1146,1150,1153,1157,1160, +1164,1167,1170,1174,1177,1180,1183,1186,1190,1193,1196,1199,1202,1205,1207,1210, +1213,1216,1219,1221,1224,1227,1229,1232,1234,1237,1239,1241,1244,1246,1248,1251, +1253,1255,1257,1259,1261,1263,1265,1267,1269,1270,1272,1274,1275,1277,1279,1280, +1282,1283,1284,1286,1287,1288,1290,1291,1292,1293,1294,1295,1296,1297,1297,1298, +1299,1300,1300,1301,1302,1302,1303,1303,1303,1304,1304,1304,1304,1304,1305,1305, +}; + +static inline int interpolate( voice_t const* const v ) +{ + // Make pointers into gaussian based on fractional position between samples + int offset = v->interp_pos >> 4 & 0xFF; + short const* fwd = gauss + 255 - offset; + short const* rev = gauss + offset; // mirror left half of gaussian + + int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; + int out; + out = (fwd [ 0] * in [0]) >> 11; + out += (fwd [256] * in [1]) >> 11; + out += (rev [256] * in [2]) >> 11; + out = (int16_t) out; + out += (rev [ 0] * in [3]) >> 11; + + CLAMP16( out ); + out &= ~1; + return out; +} + + +//// Counters + +enum { simple_counter_range = 2048 * 5 * 3 }; // 30720 + +static unsigned short const counter_rates [32] = +{ + simple_counter_range + 1, // never fires + 2048, 1536, + 1280, 1024, 768, + 640, 512, 384, + 320, 256, 192, + 160, 128, 96, + 80, 64, 48, + 40, 32, 24, + 20, 16, 12, + 10, 8, 6, + 5, 4, 3, + 2, + 1 +}; + +static unsigned short const counter_offsets [32] = +{ + 1, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 0, + 0 +}; + +static inline void init_counters( void ) { } + +static inline void run_counters( void ) +{ + if ( --m.counter < 0 ) + m.counter = simple_counter_range - 1; +} + +static inline unsigned read_counter( int rate ) +{ + return ((unsigned) m.counter + counter_offsets [rate]) % counter_rates [rate]; +} + + +//// Envelope + +static inline void run_envelope( voice_t* const v ) +{ + int env = v->env; + if ( v->env_mode == env_release ) // 60% + { + if ( (env -= 0x8) < 0 ) + env = 0; + v->env = env; + } + else + { + int rate; + int env_data = VREG(v->regs,adsr1); + if ( m.t_adsr0 & 0x80 ) // 99% ADSR + { + if ( v->env_mode >= env_decay ) // 99% + { + env--; + env -= env >> 8; + rate = env_data & 0x1F; + if ( v->env_mode == env_decay ) // 1% + rate = (m.t_adsr0 >> 3 & 0x0E) + 0x10; + } + else // env_attack + { + rate = (m.t_adsr0 & 0x0F) * 2 + 1; + env += rate < 31 ? 0x20 : 0x400; + } + } + else // GAIN + { + env_data = VREG(v->regs,gain); + int mode = env_data >> 5; + if ( mode < 4 ) // direct + { + env = env_data * 0x10; + rate = 31; + } + else + { + rate = env_data & 0x1F; + if ( mode == 4 ) // 4: linear decrease + { + env -= 0x20; + } + else if ( mode < 6 ) // 5: exponential decrease + { + env--; + env -= env >> 8; + } + else // 6,7: linear increase + { + env += 0x20; + if ( mode > 6 && (unsigned) v->hidden_env >= 0x600 ) + env += 0x8 - 0x20; // 7: two-slope linear increase + } + } + } + + // Sustain level + if ( (env >> 8) == (env_data >> 5) && v->env_mode == env_decay ) + v->env_mode = env_sustain; + + v->hidden_env = env; + + // unsigned cast because linear decrease going negative also triggers this + if ( (unsigned) env > 0x7FF ) + { + env = (env < 0 ? 0 : 0x7FF); + if ( v->env_mode == env_attack ) + v->env_mode = env_decay; + } + + if ( !read_counter( rate ) ) + v->env = env; // nothing else is controlled by the counter + } +} + + +//// BRR Decoding + +static inline void decode_brr( voice_t* v ) +{ + // Arrange the four input nybbles in 0xABCD order for easy decoding + int nybbles = m.t_brr_byte * 0x100 + m_ram [(v->brr_addr + v->brr_offset + 1) & 0xFFFF]; + + int const header = m.t_brr_header; + + // 0: >>1 1: <<0 2: <<1 ... 12: <<11 13-15: >>4 <<11 + static unsigned char const shifts [16 * 2] = { + 13,12,12,12,12,12,12,12,12,12,12, 12, 12, 16, 16, 16, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11 + }; + int const scale = header >> 4; + int const right_shift = shifts [scale]; + int const left_shift = shifts [scale + 16]; + + // Write to next four samples in circular buffer + int* pos = &v->buf [v->buf_pos]; + if ( (v->buf_pos += 4) >= brr_buf_size ) + v->buf_pos = 0; + + // Decode four samples + for ( int* end = pos + 4; pos < end; pos++ ) + { + // Extract upper nybble and scale appropriately + int s = ((int16_t) nybbles >> right_shift) << left_shift; + nybbles <<= 4; + + // Apply IIR filter (8 is the most commonly used) + int const filter = header & 0x0C; + int const p1 = pos [brr_buf_size - 1]; + int const p2 = pos [brr_buf_size - 2] >> 1; + if ( filter >= 8 ) + { + s += p1; + s -= p2; + if ( filter == 8 ) // s += p1 * 0.953125 - p2 * 0.46875 + { + s += p2 >> 4; + s += (p1 * -3) >> 6; + } + else // s += p1 * 0.8984375 - p2 * 0.40625 + { + s += (p1 * -13) >> 7; + s += (p2 * 3) >> 4; + } + } + else if ( filter ) // s += p1 * 0.46875 + { + s += p1 >> 1; + s += (-p1) >> 5; + } + + // Adjust and write sample + CLAMP16( s ); + s = (int16_t) (s * 2); + pos [brr_buf_size] = pos [0] = s; // second copy simplifies wrap-around + } +} + + +//// Misc + +#define MISC_CLOCK( n ) inline static void misc_##n( void ) + +MISC_CLOCK( 27 ) +{ + m.t_pmon = REG(pmon) & 0xFE; // voice 0 doesn't support PMON +} +MISC_CLOCK( 28 ) +{ + m.t_non = REG(non); + m.t_eon = REG(eon); + m.t_dir = REG(dir); +} +MISC_CLOCK( 29 ) +{ + if ( (m.every_other_sample ^= 1) != 0 ) + m.new_kon &= ~m.kon; // clears KON 63 clocks after it was last read +} +MISC_CLOCK( 30 ) +{ + if ( m.every_other_sample ) + { + m.kon = m.new_kon; + m.t_koff = REG(koff) | m.mute_mask; + } + + run_counters(); + + // Noise + if ( !read_counter( REG(flg) & 0x1F ) ) + { + int feedback = (m.noise << 13) ^ (m.noise << 14); + m.noise = (feedback & 0x4000) ^ (m.noise >> 1); + } +} + + +//// Voices + +#define VOICE_CLOCK( n ) static void voice_##n( voice_t* const v ) + +inline VOICE_CLOCK( V1 ) +{ + m.t_dir_addr = m.t_dir * 0x100 + m.t_srcn * 4; + m.t_srcn = VREG(v->regs,srcn); +} +inline VOICE_CLOCK( V2 ) +{ + // Read sample pointer (ignored if not needed) + uint8_t const* entry = &m_ram [m.t_dir_addr]; + if ( !v->kon_delay ) + entry += 2; + m.t_brr_next_addr = entry [1] * 0x100 + entry [0]; + + m.t_adsr0 = VREG(v->regs,adsr0); + + // Read pitch, spread over two clocks + m.t_pitch = VREG(v->regs,pitchl); +} +inline VOICE_CLOCK( V3a ) +{ + m.t_pitch += (VREG(v->regs,pitchh) & 0x3F) << 8; +} +inline VOICE_CLOCK( V3b ) +{ + // Read BRR header and byte + m.t_brr_byte = m_ram [(v->brr_addr + v->brr_offset) & 0xFFFF]; + m.t_brr_header = m_ram [v->brr_addr]; // brr_addr doesn't need masking +} +VOICE_CLOCK( V3c ) +{ + // Pitch modulation using previous voice's output + if ( m.t_pmon & v->vbit ) + m.t_pitch += ((m.t_output >> 5) * m.t_pitch) >> 10; + + if ( v->kon_delay ) + { + // Get ready to start BRR decoding on next sample + if ( v->kon_delay == 5 ) + { + v->brr_addr = m.t_brr_next_addr; + v->brr_offset = 1; + v->buf_pos = 0; + m.t_brr_header = 0; // header is ignored on this sample + } + + // Envelope is never run during KON + v->env = 0; + v->hidden_env = 0; + + // Disable BRR decoding until last three samples + v->interp_pos = 0; + if ( --v->kon_delay & 3 ) + v->interp_pos = 0x4000; + + // Pitch is never added during KON + m.t_pitch = 0; + } + + // Gaussian interpolation + int output = interpolate( v ); + + // Noise + if ( m.t_non & v->vbit ) + output = (int16_t) (m.noise * 2); + + // Apply envelope + m.t_output = (output * v->env) >> 11 & ~1; + v->t_envx_out = v->env >> 4; + + // Immediate silence due to end of sample or soft reset + if ( REG(flg) & 0x80 || (m.t_brr_header & 3) == 1 ) + { + v->env_mode = env_release; + v->env = 0; + } + + if ( m.every_other_sample ) + { + // KOFF + if ( m.t_koff & v->vbit ) + v->env_mode = env_release; + + // KON + if ( m.kon & v->vbit ) + { + v->kon_delay = 5; + v->env_mode = env_attack; + } + } + + // Run envelope for next sample + if ( !v->kon_delay ) + run_envelope( v ); +} +static inline void voice_output( voice_t const* v, int ch ) +{ + // Apply left/right volume + int amp = (m.t_output * (int8_t) VREG(v->regs,voll + ch)) >> 7; + + // Add to output total + m.t_main_out [ch] += amp; + CLAMP16( m.t_main_out [ch] ); + + // Optionally add to echo total + if ( m.t_eon & v->vbit ) + { + m.t_echo_out [ch] += amp; + CLAMP16( m.t_echo_out [ch] ); + } +} +VOICE_CLOCK( V4 ) +{ + // Decode BRR + m.t_looped = 0; + if ( v->interp_pos >= 0x4000 ) + { + decode_brr( v ); + + if ( (v->brr_offset += 2) >= brr_block_size ) + { + // Start decoding next BRR block + assert( v->brr_offset == brr_block_size ); + v->brr_addr = (v->brr_addr + brr_block_size) & 0xFFFF; + if ( m.t_brr_header & 1 ) + { + v->brr_addr = m.t_brr_next_addr; + m.t_looped = v->vbit; + } + v->brr_offset = 1; + } + } + + // Apply pitch + v->interp_pos = (v->interp_pos & 0x3FFF) + m.t_pitch; + + // Keep from getting too far ahead (when using pitch modulation) + if ( v->interp_pos > 0x7FFF ) + v->interp_pos = 0x7FFF; + + // Output left + voice_output( v, 0 ); +} +inline VOICE_CLOCK( V5 ) +{ + // Output right + voice_output( v, 1 ); + + // ENDX, OUTX, and ENVX won't update if you wrote to them 1-2 clocks earlier + + m.endx_buf = REG(endx) | m.t_looped; + + // Clear bit in ENDX if KON just began + if ( v->kon_delay == 5 ) + m.endx_buf &= ~v->vbit; +} +inline VOICE_CLOCK( V6 ) +{ + m.outx_buf = m.t_output >> 8; +} +inline VOICE_CLOCK( V7 ) +{ + // Update ENDX + REG(endx) = (uint8_t) m.endx_buf; + + m.envx_buf = v->t_envx_out; +} +inline VOICE_CLOCK( V8 ) +{ + // Update OUTX + VREG(v->regs,outx) = (uint8_t) m.outx_buf; +} +inline VOICE_CLOCK( V9 ) +{ + // Update ENVX + VREG(v->regs,envx) = (uint8_t) m.envx_buf; +} + +// Most voices do all these in one clock, so make a handy composite +inline VOICE_CLOCK( V3 ) +{ + voice_V3a( v ); + voice_V3b( v ); + voice_V3c( v ); +} + +// Common combinations of voice steps on different voices. This greatly reduces +// code size and allows everything to be inlined in these functions. +VOICE_CLOCK(V7_V4_V1) { voice_V7(v); voice_V1(v+3); voice_V4(v+1); } +VOICE_CLOCK(V8_V5_V2) { voice_V8(v); voice_V5(v+1); voice_V2(v+2); } +VOICE_CLOCK(V9_V6_V3) { voice_V9(v); voice_V6(v+1); voice_V3(v+2); } + + +//// Echo + +// Current echo buffer pointer for left/right channel +#define ECHO_PTR( ch ) (&m_ram [m.t_echo_ptr + ch * 2]) + +// Sample in echo history buffer, where 0 is the oldest +#define ECHO_FIR( i ) (m.echo_hist_pos [i]) + +// Calculate FIR point for left/right channel +#define CALC_FIR( i, ch ) ((ECHO_FIR( i + 1 ) [ch] * (int8_t) REG(fir + i * 0x10)) >> 6) + +#define ECHO_CLOCK( n ) inline static void echo_##n( void ) + +static inline void echo_read( int ch ) +{ + uint8_t const* in = ECHO_PTR( ch ); + int s = (int8_t) in [1] * 0x100 + in [0]; + // second copy simplifies wrap-around handling + ECHO_FIR( 0 ) [ch] = ECHO_FIR( 8 ) [ch] = s >> 1; +} + +ECHO_CLOCK( 22 ) +{ + // History + if ( ++m.echo_hist_pos >= &m.echo_hist [spc_dsp_echo_hist_size] ) + m.echo_hist_pos = m.echo_hist; + + m.t_echo_ptr = (m.t_esa * 0x100 + m.echo_offset) & 0xFFFF; + echo_read( 0 ); + + // FIR (using l and r temporaries below helps compiler optimize) + int l = CALC_FIR( 0, 0 ); + int r = CALC_FIR( 0, 1 ); + + m.t_echo_in [0] = l; + m.t_echo_in [1] = r; +} +ECHO_CLOCK( 23 ) +{ + int l = CALC_FIR( 1, 0 ) + CALC_FIR( 2, 0 ); + int r = CALC_FIR( 1, 1 ) + CALC_FIR( 2, 1 ); + + m.t_echo_in [0] += l; + m.t_echo_in [1] += r; + + echo_read( 1 ); +} +ECHO_CLOCK( 24 ) +{ + int l = CALC_FIR( 3, 0 ) + CALC_FIR( 4, 0 ) + CALC_FIR( 5, 0 ); + int r = CALC_FIR( 3, 1 ) + CALC_FIR( 4, 1 ) + CALC_FIR( 5, 1 ); + + m.t_echo_in [0] += l; + m.t_echo_in [1] += r; +} +ECHO_CLOCK( 25 ) +{ + int l = m.t_echo_in [0] + CALC_FIR( 6, 0 ); + int r = m.t_echo_in [1] + CALC_FIR( 6, 1 ); + + l = (int16_t) l; + r = (int16_t) r; + + l += (int16_t) CALC_FIR( 7, 0 ); + r += (int16_t) CALC_FIR( 7, 1 ); + + CLAMP16( l ); + CLAMP16( r ); + + m.t_echo_in [0] = l & ~1; + m.t_echo_in [1] = r & ~1; +} +static inline int echo_output( int ch ) +{ + int out = (int16_t) ((m.t_main_out [ch] * (int8_t) REG(mvoll + ch * 0x10)) >> 7) + + (int16_t) ((m.t_echo_in [ch] * (int8_t) REG(evoll + ch * 0x10)) >> 7); + CLAMP16( out ); + return out; +} +ECHO_CLOCK( 26 ) +{ + // Left output volumes + // (save sample for next clock so we can output both together) + m.t_main_out [0] = echo_output( 0 ); + + // Echo feedback + int l = m.t_echo_out [0] + (int16_t) ((m.t_echo_in [0] * (int8_t) REG(efb)) >> 7); + int r = m.t_echo_out [1] + (int16_t) ((m.t_echo_in [1] * (int8_t) REG(efb)) >> 7); + + CLAMP16( l ); + CLAMP16( r ); + + m.t_echo_out [0] = l & ~1; + m.t_echo_out [1] = r & ~1; +} +ECHO_CLOCK( 27 ) +{ + // Output + int outl = m.t_main_out [0]; + int outr = echo_output( 1 ); + m.t_main_out [0] = 0; + m.t_main_out [1] = 0; + + // TODO: global muting isn't this simple (turns DAC on and off + // or something, causing small ~37-sample pulse when first muted) + if ( REG(flg) & 0x40 ) + { + outl = 0; + outr = 0; + } + + // Output sample to DAC + #ifdef SPC_DSP_OUT_HOOK + SPC_DSP_OUT_HOOK( outl, outr ); + #else + spc_dsp_sample_t* out = m_spc_dsp_out; + assert( !out || out < m_spc_dsp_out_end ); // fails if output buffer is too small + if ( out != m_spc_dsp_out_end ) + { + out [0] = outl; + out [1] = outr; + m_spc_dsp_out = out + 2; + } + #endif +} +ECHO_CLOCK( 28 ) +{ + m.t_echo_enabled = REG(flg); +} +static inline void echo_write( int ch ) +{ + if ( !(m.t_echo_enabled & 0x20) ) + { + uint8_t* out = ECHO_PTR( ch ); + int s = m.t_echo_out [ch]; + out [0] = (uint8_t) s; + out [1] = (uint8_t) (s >> 8); + } + m.t_echo_out [ch] = 0; +} +ECHO_CLOCK( 29 ) +{ + m.t_esa = REG(esa); + + if ( !m.echo_offset ) + m.echo_length = (REG(edl) & 0x0F) * 0x800; + + m.echo_offset += 4; + if ( m.echo_offset >= m.echo_length ) + m.echo_offset = 0; + + // Write left echo + echo_write( 0 ); + + m.t_echo_enabled = REG(flg); +} +ECHO_CLOCK( 30 ) +{ + // Write right echo + echo_write( 1 ); +} + + +//// Timing + +#if !SPC_DSP_CUSTOM_RUN + +void spc_dsp_run( int clocks_remain ) +{ + assert( clocks_remain > 0 ); + + int const phase = m.phase; + m.phase = (phase + clocks_remain) & 31; + switch ( phase ) + { + loop: + + #define PHASE( n ) if ( n && !--clocks_remain ) break; case n: + #include "spc_dsp_timing.h" + #undef PHASE + + if ( --clocks_remain ) + goto loop; + } +} + +#endif + + +//// Setup + +void spc_dsp_reset( void ) +{ + // Clear everything to zero, then set things which must be non-zero + memset( m_voice_state, 0, sizeof m_voice_state ); + memset( &m_spc_dsp, 0, sizeof m_spc_dsp ); + + m.noise = 1; + m.echo_hist_pos = m.echo_hist; + m.every_other_sample = 1; + init_counters(); + + int i; + for ( i = spc_dsp_voice_count; --i >= 0; ) + { + voice_t* v = &m_voice_state [i]; + v->regs = &m.regs [i * 0x10]; + v->vbit = 1 << i; + v->brr_offset = 1; + } + + REG(flg) = 0xE0; +} + +void spc_dsp_soft_reset( void ) +{ + // TODO: doesn't reset everything + spc_dsp_reset(); +} + +void spc_dsp_init( void* ram_64k ) +{ + m_ram = (uint8_t*) ram_64k; + spc_dsp_reset(); + + #if INT_MAX < 0x7FFFFFFF + #error "Requires that int have at least 32 bits" + #endif + + #ifndef NDEBUG + // be sure this sign-extends + assert( (int16_t) 0x8000 == -0x8000 ); + + // be sure right shift preserves sign + assert( (-1 >> 1) == -1 ); + + // check clamp macro + int i; + i = +0x8000; CLAMP16( i ); assert( i == +0x7FFF ); + i = -0x8001; CLAMP16( i ); assert( i == -0x8000 ); + #endif +} + +void spc_dsp_load( uint8_t const regs [spc_dsp_register_count] ) +{ + int i; + for ( i = 0; i < 0x80; i++ ) + spc_dsp_write( i, regs [i] ); + m.t_esa = regs [r_esa]; + m.t_dir = regs [r_dir]; +} diff --git a/src/dsp/bdsp_official/spc_dsp.h b/src/dsp/bdsp_official/spc_dsp.h new file mode 100644 index 00000000..e0ba0582 --- /dev/null +++ b/src/dsp/bdsp_official/spc_dsp.h @@ -0,0 +1,162 @@ +// SNES SPC-700 DSP emulator + +#ifndef SPC_DSP_H +#define SPC_DSP_H + +#include +#include + +//// Setup + +// Initializes DSP and has it use the 64K RAM provided +void spc_dsp_init( void* ram_64k ); + +// Restores DSP registers using supplied values +enum { spc_dsp_register_count = 128 }; +void spc_dsp_load( uint8_t const regs [spc_dsp_register_count] ); + +// Mutes voice n if bit 1<