From ec64a7cf6e372b63b1fb9ced5216be1e2495a615 Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Sun, 7 Apr 2019 22:13:09 +1000 Subject: [PATCH] Initial commit (works, but bad) --- .gitignore | 1 + Makefile | 300 +++++++++++++++++++++++++++++++++++++++++++++ MiiversePlugin.mod | Bin 0 -> 173704 bytes README.md | 12 ++ makefile.mk | 64 ++++++++++ src/main.cpp | 86 +++++++++++++ 6 files changed, 463 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 MiiversePlugin.mod create mode 100644 README.md create mode 100644 makefile.mk create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dd480be --- /dev/null +++ b/Makefile @@ -0,0 +1,300 @@ +# You probably never need to adjust this Makefile. +# All changes can be done in the makefile.mk + +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPRO") +endif + +export PATH := $(DEVKITPPC)/bin:$(PORTLIBS)/bin:$(PATH) +export PORTLIBS := $(DEVKITPRO)/portlibs/ppc +export WUPSDIR := $(DEVKITPRO)/wups +export GCC_VER := $(shell $(DEVKITPPC)/bin/powerpc-eabi-gcc -dumpversion) + +PREFIX := powerpc-eabi- + +export AS := $(PREFIX)as +export CC := $(PREFIX)gcc +export CXX := $(PREFIX)g++ +export LD := $(PREFIX)ld +export AR := $(PREFIX)ar +export OBJCOPY := $(PREFIX)objcopy + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build + +ifeq ($(notdir $(CURDIR)),$(BUILD)) + include ../makefile.mk +else + include makefile.mk +endif + +include $(WUPSDIR)/plugin_makefile.mk + + +#MAP ?= $(TARGET:.mod=.map) + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +# -Os: optimise size +# -Wall: generate lots of warnings +# -D__wiiu__: define the symbol __wiiu__ (used in some headers) +# -mcpu=750: enable processor specific compilation +# -meabi: enable eabi specific compilation +# -mhard-float: enable hardware floating point instructions +# -nostartfiles: Do not use the standard system startup files when linking +# -ffunction-sections: split up functions so linker can garbage collect +# -fdata-sections: split up data so linker can garbage collect +COMMON_CFLAGS := -Os -Wall -mcpu=750 -meabi -mhard-float -D__WIIU__ -nostartfiles -ffunction-sections -fdata-sections -Wl,-q $(COMMON_CFLAGS) + +# -x c: compile as c code +# -std=c11: use the c11 standard +CFLAGS := $(COMMON_CFLAGS) -x c -std=gnu11 $(CFLAGS) + +# -x c: compile as c++ code +# -std=gnu++11: use the c++11 standard +CXXFLAGS := $(COMMON_CFLAGS) -x c++ -std=gnu++11 $(CXXFLAGS) + +ifeq ($(DO_LOGGING), 1) + CFLAGS += -D__LOGGING__ + CXXFLAGS += -D__LOGGING__ +endif + +#--------------------------------------------------------------------------------- +# any extra ld flags +#-------------------------------------------------------------------------------- +# --gc-sections: remove unneeded symbols +# -Map: generate a map file +LDFLAGS += -Wl,-Map,$(notdir $@).map,--gc-sections + + +#--------------------------------------------------------------------------------- +Q := @ +MAKEFLAGS += --no-print-directory +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS += +# +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS += + +NEEDS_WUT := 0 + +ifeq ($(WUT_ENABLE_CPP), 1) + WUT_ENABLE_NEWLIB := 1 + + LDFLAGS += -Wl,-whole-archive,-lwutstdc++,-no-whole-archive + NEEDS_WUT := 1 +endif + +ifeq ($(WUT_ENABLE_NEWLIB), 1) + LDFLAGS += -Wl,-whole-archive,-lwutnewlib,-no-whole-archive + NEEDS_WUT := 1 +endif + +ifeq ($(WUT_DEFAULT_MALLOC), 1) + LDFLAGS += -Wl,-whole-archive,-lwutmalloc,-no-whole-archive + NEEDS_WUT := 1 +endif + +ifeq ($(NEEDS_WUT), 1) + ifeq ($(strip $(WUT_ROOT)),) + $(error "Please set WUT_ROOT in your environment. export WUT_ROOT=wut) + endif + CFLAGS += -D__WUT__ + CXXFLAGS += -D__WUT__ +endif + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- +export PROJECTDIR := $(CURDIR) +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) +TTFFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.ttf))) +PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export REAL_LD := $(CC) +else + export REAL_LD := $(CXX) +endif + +export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) \ + $(PNGFILES:.png=.png.o) $(addsuffix .o,$(BINFILES)) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE_FULL += $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(EXTERNAL_INCLUDE) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS_FULL += $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + $(EXTERNAL_LIBPATHS) + + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean install + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).mod $(OUTPUT) + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +############################################################################### +# Rule to make everything. +PHONY += all + +all : $(OUTPUT) +############################################################################### +# Special build rules + + +# Rule to make the module file. +$(OUTPUT) : $(OFILES) + @echo "linking ... " $@ + @$(REAL_LD) $(OFILES) $(LDFLAGS) $(LIBS) $(LIBPATHS_FULL) -o $@ + +############################################################################### +# Standard build rules +#--------------------------------------------------------------------------------- +%.a: +#--------------------------------------------------------------------------------- + @echo $(notdir $@) + @rm -f $@ + @$(AR) -rc $@ $^ + +#--------------------------------------------------------------------------------- +%.o: %.cpp + @echo $(notdir $<) + @$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.o: %.c + @echo $(notdir $<) + @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.o: %.S + @echo $(notdir $<) + @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.png.o : %.png + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.jpg.o : %.jpg + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.ttf.o : %.ttf + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.wav.o : %.wav + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.mp3.o : %.mp3 + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.ogg.o : %.ogg + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +############################################################################### +# Assembly listing rules + +# Rule to make assembly listing. +PHONY += list +list : $(LIST) + +# Rule to make the listing file. +%.list : $(TARGET) + $(LOG) + -$Qmkdir -p $(dir $@) + $Q$(OBJDUMP) -d $< > $@ + +############################################################################### +# Clean rule + +# Rule to clean files. +PHONY += clean +clean : + $Qrm -rf $(wildcard $(BUILD) $(BIN)) + +############################################################################### +# Phony targets + +.PHONY : $(PHONY) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/MiiversePlugin.mod b/MiiversePlugin.mod new file mode 100755 index 0000000000000000000000000000000000000000..80802e3cccf619ecbc667b68cd408e1e3fc6fa83 GIT binary patch literal 173704 zcmeFa4R}=5wKu-cnMrc;0StB2C{ZURU;-f-AnHsK!WjZONl*t!3M!g}BtRq|V-j?z zGnvT;njp6MKm|=gR8&;1wY_+o)_~y^Ehx2IODVTf3yS4KT2sXuB*}SyYoD29f>?X+ zeV+f*_xYbZ4(IHB_Fj9f-&%X^wfEU)>s_$$W-H`M|KA=c*DjdYKO3} zvyT0c`M&14OiXTOOy12FlKjE)HlRFYoz_suq9Cukp^h0y=7y)45jdP|*u$bp&W7VG zhHz7H2+a-PWofK7Sc)oQ=JqjWXAcW=j~Q6nhpQUrcAJ=`n_cfcalz$%^9#rud3kaJ z=b?9QH)B*jZC8am?Zfhy2=}@8c~4$&ftMS+&wa{q0^P}J4_4%;ZH645E02`9F;K=^ z^nokQ$C$s&uCzN>6}z82mgM$+WVADJL2?I+N$X&G!kA>IHiGMt{9N`vmPWF3Ss^>g zJyzzBf;5Hcy<1N)(2584COeCWhTa8t!(>-oLYL&%vnePqIyg_Yk1mPqqaF6)es;R6 z{Wy!FGGr(2t&?43C&^o3hqaSjwk~EN%y2cUdaiFKJl!R*BaUfA9<_zGqv?6T&LF3e zo`e4=$bt5_of`c1-tVuY@_{nm6A6cjp8y|3i`#4Mq;*w`n~3owSfpZp`*TyDq& zehdM*sekc4)y?9G2K6P-=>(l9>N~_6@kKvN0b_I}JngKmgVR&7HNf7)08PqIZ)761 zV<}dY+#(he{5(L1e8C)v_BZ>3OQMNADd9{_B@&T zySMRU$S?lXy?N{J=3y{NJpz}!Ol9BjRCy<{4wG$kOv)DMs%=7Iot4v(%k-cH|AQ;K-lE)khT3`Cr$GWUp)s_$RyFGFPN4(qg!EuGj)PQMj6LHQ*|F zrsTMMTg7NA%ByxMy-4`_F+rI?etk#*Bl{AYMr8Z{Ko-9}1o~CM|4z2BUkAxHB6E&1 z_{pg5E-hbTh#DV|pCz9!*9+a=hoWV7Gi(@s0QPs#y^p0NH*r4{V>$&tc&}`BKb&rM zzm4meB`$ZfY|h=+n34OYKEtyi^YOgv8#6p*w!@yrBA5Hw!o!|54u|_pnrqR$zH7bf z9WrRfd9r62EgKcZ`;bGnbz)pl^P`YAOwT+EQ0Jx0$2}po!|oTRyWB+yhdq+Ru_zog z8tg0wx05Y1D=)9j@)-3$FKAms4wKjLykw5JnoKKq{_0xde~F2%&}-S$swyeNC7!y zl?UX5hvl9S+2L8eXzK)a({}t*|K9%7V19C`8RR?UmoG#;Ln#VFDt_&gS&D1 zH~9CikEV9w-Q6rD$p^k4XDPN0$o`Ot^2zTCBzumcNVsQoe=!EJCg^ZGGrQkfXm;1) zw>=X&TxiYf@w|Va z9`3vA-c@?)K2>__BbC1T>B`>v9A#hq8s$L!Bg(=0mz6{H?>ja-b&5)3p3Gt%&1Ax(aZI3R zwl1aLUFvYqxK48OD`>!$`@qu#@YLgOo)qBeC@|@#u{QT4yOI1~?y2J$mXpk2l|Vln zJl+exp3Mxtca(GB+u(~(23kuo7m82@TlOpGTEdYI=lmXVzQm&3jj6`m?O_>+EjL;v zWzaewGE4otEvIpfG^Bcp?=&{PgIIgRGI`UlcI_qnj$)E>#3C!tINY_)Nokz|*5 zvuKim`({5L6suVmFu|Gt-8Ld-%F;dm=zJ!0W-$S{4FqJSI*|K_CnS@ud!40B2fofy zJJtn?;(k&0d~Q={29-lQ+_zb?6$O~?B^_-ESCsp%C*3J$r*FWulQrc&9GZdq3Av}_ zBu`ix@Ph40Y2@R(EoYSe+>;zX!F^iyd}}z`0cODG9DV_u&gR_`mYR2SSVr>0@UQR8 zrn!LGdb2XfG0Fy3FTt;Zx5vVm9`X!YBbbo;PT1}MHpv@ECyK&x$i}nA&L5$O zNuQ6#!u8=yKgT|-ShI%}_+$7Yi`528hyF@&V7|yHA zkwrdVaW_qN6+(_e$Y!Zy65>&JYb=YwPo3uri0uW6^O&_R7BP&B*abZMP!3}g;w5#y zL2-fmdC0yV<8SdKm#=iya>%}EQ|$0QkB?1N<0>J&wT_)=6Ij3d;A~gh9zk+HKH1g2 zM~HXtrn#GtNONsFv&K?CrT7PY9L!OM_aJ7KS_;`dJ~kAxM);8zpT3brp`ZI`PE~iK zKW^;0!ri)uooYSK&bGy}b8R*@&{oI>+v)_?_OzgHJ1#`E3xc6NRxq~Pgy{A{A*Q`f zFttA|#8E7h0r}9TE2Ds4Ye=rXaHnLQRTfQiA3WP`on5gl^=aS|%U-okb1uX62-T%| zc!p1%d$&E!oJR!KSNoHfNrv9EU8|PkdLVU^ldgx-9(0!Bx}$Cm{L9fVD3(w0+eU6f z7CT{QmMr(mNiNHA*63aTu?xD{O#a>rd!xBzq7F7w&z9MIf)je#jJi{7T|$(%<7y+( z4A6ru?8Ni!D$Sd|{4Sd4cdvTyIp#=ylG~(=x;56%5PRF0i|n)gH_8Co3iD*YZ*0F^ z8H5ZqSPyd9It4w-?(ihMPisRvi8-}+4wxJytO%d$I#|Spdk_;e ze`KV5v>7gUDyIUt$(_RolH1Vs?qNR10WCYnoG~Hw7!%TvCSBC7dy4wR&LsFZTzjm2 zj8%ijThR_|T1ty%V)bm+2+Uj>WKfK&N8Z#+z#K;6>jkS-ih|ZcUDgm zm|P#$58J5mB>a->+=X#kXuqBN@US+thrUo_>kQjY^{b&z$P?vV#`%x;cJwj1gGt_) zH+jE+eCRJ9sr{uZyq~ZE%^F)9#{4?Allps(@|O_RUM?I7=v%H28LYaO8RUAM9aoub z$X0*(c3bCF?jW5D0i8c9F)dO7sqziv>`|U{r}}}*2hg^G^h5fR z>y7i1e?&3TRWY8os$J9{yqUixzulPxzXU(M)7BQlZJu;}TNL6b=&tr_yMuIHd%9=9 zlQ8V89k5&cGNYfcbFev+YUhJBu)$~i_p6aF`0tlDgD1KtUn%b%T)6o-dj|8x`GLM< z>m0Z6QZiXhW*6+9{WO+!2l^1%IOI9t$3{$*VLy-ywn2V@5p7$S&PV;@2kSyBAQB|b-o5bV<*~E?cTT^~73LT^RHKI>n`Ca;@`I8)=quNDOv90rp=)8FN0tfd6s$FEy zGolaesGA1A5Haj*MSOvEE7U*lBz&j0u`*lNglJ%7$WgvNfvc?Q;Oihe)ag||MdK)+ zm!+e<6PMD#%dkW5MCd)?5!i}2NH%4wAD@^Oi&z4F)jRoJZc91Jm%kp>=VhBO#k=n% z_$2rf@6>l)-ub`vzXQ11liYw9^8s4xjo#>XMGttRhn;R$AGb5I=N#pNkMJS6s13PZ ze3fvLJHJ;3U#Yjo`+YEMCD3P}o3j_y+3Bz2{FXYvai|AvNGfLMx1lXT?Q@Y)meWk{ z_sc@=$!H7uso;rEHSP;n*BAFUI}Jw=JM6=6kckGxSHR@XNQvxre;wj7^~;LYdfjq_-|2eD%tn+Du= zkZNvK*T5 zc)DopQ^(veJ}#opJ}Tqe!wz~9QjPSS%C+pn7;%cm=CF8-!BRTp<8~c}IQtZnd{47p z%NZt+ji-J><4ov$%-h1!?xgwmFOBVXZpW@R&}ac)w$3QYvJY!WXPD?Y^`OiBo7pZZ zk9H4PZEPczp*1VCtLJ>8zT7!b92~3JnY@UrL?2_ztF^9Ui{!e$_ainkPz;7S zxDz(O+f1!i`l(%dhWup|U-35mF&XhsZIX?Av(1eE^tZ`~4z){kNDtHwwSjg1SBa)4 z;Ynj4&I{0NtK>KjP^?BgfX7_)BR?*zEVaOo%X@wv@eDlXek(4ZcL^S6s64XeR?y)* zf)3{q_<+BiM9-5@WxN>Y*543+I*t#I^WdU`(t#*>D^BB&Mmx%?*u=+Wkd^dCDtEj9m!9SPYFAO z`ySrMpFkh)3~8D{`H!+h>OcQ@&M?71GTJtV>_pj~+OHg#bA*!pcEJ97y&GiA9YU5- zUm(9q{eb)`^#kr(!3*@v`xecA5C?O5DBt64a*!|SrFDGI(j_kV9_qV2pwnA>%Hr_z z$md7IBl3HQKJ_i4@4Yh>bA8oUsIh9#uIMWU zW15V;33#^yUl|QqrPQzBEBUkVBg7;1U-DgnF{^zw?8|;h9C_X zPx(CKFVYAf35b)z5ho%3{zoyeZP%BKVq(PyU%7Rho#Lk-*h4@6;J9E;lGrV_uE@Q% zHa*!&-->ktd-pi&BMjA8lSL`V1{_Gwn9;^o4w?p9Y(J7r7~gNUbxF~%^987Hw$i%h zakdF-1Regltw{55JDZq?va8%b#QSlY*L6k4BYqU*`p9^+=caz@Nwqs*FFoity>c6i zL4Hqivob_uz4u3mFghYSQWq=3)c341oBkwX6KlMp5PzuCA!EHKHXdW9%w`}je2a}e zigE%;V~xq|Z8FJNC(76|74bvIID^M7IUw(&u=@sD&jx+z zQSi};K1OT%?vs+kdOdp>JRX8fy^!?~+7oKeWE;U>6Y}=eenoo@Ft;D*89=!nns?O> z^jYjI%sHaxpm-Q#;AWZwk?n&=k=CYEd-~FT>HKqjqjSQrecxtZX^6w%d-z%t=6iOG zof7#x@^Q9Dzjh<0?H+5_gPW@%tNhH@+qtjYAdmP;dDquRXJ9Rk>LZ3WLQY)&nuvLm zfcX<&Gt5yw-A6tUbQfYBL{`^qKA1y&ujPLJGr+ETfQ|e=U6*dXkzsxDbTRoS@-2wH zi$~%aj2WZ8D|F$v`q#=!`K}x8R(-@*8%egnm`MKB))~6#+b{+XJJhv;)APMI|JJoM z;?(fc@UYs&(@yDsF!R)~XW0^3D>l;{jBG6JW(t?|GI+EqU+ZJ{+D%n5h6AGq4+ZEzyaLSKx=9xJ}?!>FHb za=+M@r0$PU_9k74zTc+XhW>NC+^K)n@&s&)udV+6G5B+=eTNpH{hh#pukF)16nM$< zUJtpk-T+xPjjl0CL*6H%u?846p!&PlU7plmyduAf`4)KQd9Y3LfzS(I1Eo1Wt##)p zXAQPpf9VMFZ^EeG`%8;$*Iy4^`q^LiprdRjj}03G`|B4q7Aj_ou)1 zU>&6IqB?p0I*p@s{?-hBG_Z5(<=3*PC{&7hg ze@rLy*s)_MCiw}azxFG3Q0~xgzO+Bn`~G|W%>1Y-$LGBPIfyUvXSAMRwPS9Ib%8(} zPBGoc8p5s%d&w_Y&tQL*o&5c0eV2#@bgB)8XHgvB)m0grQ+a%0rgbG-mp&fvW+e38 z4sY~4V;^+x4S&<6Y^7(I1JF8WAI9J2J{jx6G1e@^*f!?gyr0{N+q;?e0V!vB96{qO zVgj-w+t0r0kze`h0A%U;K`H!7LN%=sV7{S0NU;OfB1|;zApMZ9w6%%b5JQkH&H(+L zNfGMW8rkE!h?Ug!=0CTL)#2%Lq+{qe8e>|Y+Q)zSjXqB61@OVIk`Cd6im46w#Tn|_ zD)t$p&p<{-eFozpQ}GJfKe{d}o>Tk!VA_4J;p+@K585rBb+siO`mER zn?4;sHvQ)odLN>$IUWlkxo9n#{1e4R^ge{vq)ATFi7Ma8bA(lZPdl5jCrA0{0M*6X zpIt3;p&;;F#dSufD#vFBE|!_>UhX(geZAwNI;H+Pn*)6Wv3>{c)p@JBHg%N7YOIaN zc&1@JHNigMu?#yY4oa2TD$lY$3ozQ8HXi*2@v=AMO?pqwV`k{wA1{Yap+16`8FBf! zBh){Tnxp)^>7sJ} z{{L5sQB}QS9HlxG6GKjiU(S8hZ*bpRdwMZqSiwZ^q_}L5lj2tJ*z=G20M-vLnwKR` z^z$eOcqAQQjW~tgeHSJ$`KP$%D8~l*egfdY{le}Ghhl*v=G7e-!=Z0Q0VX?8?kL4j z=*MRCtses~TK_wQIl+&Bk9%xi_a#o&SX8#HOnV;{xpwO>^kFM3At zd>>(fIZ6%bgY<>9q~(5J5SOEz+=((hgiUM$Vt&N=@Tc8@Jjl3@FuaJao90L~c2FM( z*m;ifiNR0T1iH&1Q;_danp9uL4Cwnjh6nE{#Cz&#YWEwwM>ieBd#Z=OT1I`bg%&z}HK z^iJ>)d|Nc`vELH!(2`1ixdsxc1B^_&>18oH8r@bkV zo)-qSv(0@f%|-K03$TQLBAJiWO=j3jgYP2Z@LfamKG>0n{WL5(ZHuD7&l{FLX-EYY zacL)*vAvKP(~9u@&fJ4Zv>ymqnLJOuZ}fg}Fo|Mp?0=8(zJYX?U2YLrqW8m`$6=R; ztVN*xXZS`2nel^;^>x_0)%Yp)v~`;0yexf2UN-i>eu90xA@hv6C$axE;cwWtieG|g z%$tJ!p$T}Ffc3BJX-3bKhn#tK)R9q6vN$}_G$ZZL^+*pnTc=|@?NGWsX$O=1_Lys3 zs0@0a!v5b5Hoq=W8T98{Vkavn)2!GJnV4WuwwMu*Z!l z{p}4{cY6u1|1?|^z;8D8 zq;fg1*Vz7$llJW`ng-sdg7;fE?|n;~v2W!r>|068rtur`0oLNPMr5$pVecT;J19Th z^tE!*8iREMyq_T%yv;J-hek5Y!#>Ag8L+pI_B5WQ?+Mzmh6-Cser-DThOr~=!?RuO z0z2l3Mte4P3ifjrw$<^U7i525Xu`K-&`k)%H~8ko+uu5e zv8DUj5BR&Au8=bD(*%Atw#Bl&87R{?(JA2_RujFm0|on*b`*USd&(vsU%J0!uG=#S`)WcA zKGcQ(mOKj<8?6!gS+EI{+!?VcR${Vsn*Mv<4`s8rbfFpj&^5=DX$HPAt+DDiDHy}t z)@h0YnWG6`_{eR8Q7rz5z&3;C=DI@GF(-T2&|1hg;aLmdqj!8QeUh_rj+|+xboo>t zqdMt6JX`JT&M1ICvf&#dJZss*;`TQ>x9?fv^bPq|e2sNK)Bbqpt5$(E4l+mlp8K5A zAY1XnAs@R|@hxK>-z~4yVXqw4&=Si}`G`(@E9?_(#t&_D#FJib|FD0aM`ly=ve9SH zxE#}e%&zbx#5=6}X?-ko8?~EvCfZ_^?z50C-BRu=T%R4GW*SGh-~5b^2b)u6vX9Wl zacsZj7t6M})x_3{o1;bhfUj zT&(BR;2z)9h01AtSbKg9G&>`=qc3c){l&|!+U}QK$v$=^)rF1D_fE&UNauu8mIA(3 zsL#um(rM2n*7op?A?A6_OvZbVvn^Xu7GnT(&|+s-`~^B`aXT?4d9i2c5jGxc&&%tG z4;ufwbPkG@@vd<59LQFCdaBc!eV^qAC$4pQHpIPxeW}=Q6uA+0-$F57JM;>jv`}3t zkFr?jV)1$LG(Q=CANd!g4g2qfziwp0&_?ld#8VQzj~`?OacFn5+AcHF7_+C@*+lys zY#rlz$Ue#%xehJ#tfh{nCvQQScBgN@jal}TI$MS|6hN=bQva(Ck7MxzKXbAM`>@uw zy7tuTE^pksF0u`>TVO3)W0{X^iTbt2cl#^p1;7$@hI|gH@3R!$XCXVq-f5+Lx{u{$ zM_cfGKE+`BK|jsOg#Cq#ubX;wxvva8QV;0$%n6444NJf$eGPuj*e6;u347?W7`YvqPz9mgj$o`2}>L(c6 zwx^zgjcmhQ4Ypxtm%rxsRcuQd=EHyIdXw5+s!t^UM1Be}PY?M<^s!#fvJ=;A86H$GAWHC;iyc4_PhmALxAKXSt9417ab*KmY5Fr61}ttfuQHc;ES8 z9rva6tdaO7e+pmPW83|8uhqn5hL%9E< zz7PAry4wXyQ2W%j1RgBZKE_601L!nhT!23C9UQRi5a`_?`kJtb`n4KQpe`_MUy8Vw|)WcUCtNr=*f!aw8 z&|&BaD#v{^>Vh8mn`N+-n*FFV$d)7G`nv?tTK5q9`9-dA@I^;)fplHQkTCffxT z*fR>-MHwm^R1W=YSseCaIN{d|=o>_e_lA50u-&E9zO&qp_61gqefQLU0lotm9@=P+ zM;XUpl=wAbryYZgO(PoyRt9z&W0U7DzK6+b zy^Gchm9x|)fA2AkbT!11uEoMd3~00oZn-)1Q0hADZQZn){CS5bceA6m<|&uwv&F_# z$WA({wYE4AuNi6=wYxm;y<@Dsqs?gXscVULX8ap{V{FH#w1Ke#_TnEW*z)NZA3X2< z&`4tg=~do!p60-UwSdp}y3>$HzCX>RD5>2%c3|z;w@v;YZGhjeEq=N*)^fU--#30A z7+Cx0`FR({kPxDQ_`~eE;g`lV$P1lrC*HlLcd?Flz87YSwc_(TQC1|ovUQ!`1U~SA zB^nhI)^)-JVTviWX@IQ@XYTKW65uU^g_BdetVR3xU zhVSIOtxi@u?Gf;;KUABIv2|LL!}E^Qk-UlcX1RFR=fEBjV2SrGI0vA%J$K_fz<=*vB-iVu85qk)^?6yWy9WCR9~D~UW<9eW zLpwhbx@pXH7gZUZMeI6Ty^tH5$xMi`vF! zFMaoIxQ1vE4ezs`V*dL1eQ9p&lbeh+ec;)Zj(J5l*7W_p-jn)~QJteH`^erXAJ6$( zIO2m?qC@oT?8^ISZbJPEYmAPueM`Uk+xpfP^efH_A6F*a&12}@=QqRFNMF(3j((Y9 z0{Y%qm3M-5^o)iHGhmlxuti{qwThY9z>wA&hI=RP!+!qSely+~x=E*=PagEwHwuK8 z+${Eze(F*XU*WqizHdJz+vqE$@30Lsp%)YAETpyw7mf+%ar_^F^>(rm^3{mL+#W0T z=aC(f-pHn=;C%@%d%3{N!A89Ae}VT>x>HuOqAaZp8}=r^7hKj5q=$Zf_Jq3vwgW43NZ(Yaz6+=geq8N~AGl4h8uxGBYVcIWzwt5>F7OGk#c}sx>~rG!D1Qz-)iT5VN$@lBW9+QF z`+P3hhM!)Dis`t!c^`!iRhfK3{Cx%Q`=6t-81K&} zKLvjb`@(*6wlqsO*PHcQ%%3itLmymbg+IVPC4q3Dcfg#lpAGc|c*1+hKNA1cC#lap z33<>~ljogkqMb;zF_z6Ap^NcsZGyL-+Os`#p(S-O{QG)E^t07*3w?|F7yK^h%nypS zSI;r=Si8(0XRrQ8aW<93IMjkNn<$P(j1iAJMdmrx_It^HM(APu7r1lV|>}fJi=e~ zW#4;_+eD{WhJI}&KZL$FlfJp4{!x2RJLzE|+OtyL7JnY4kuUkWu*SsufB3)EWnk?F z{n0|-VPnsNrHDo4O);eAC~sd=yY1y5UuyWBYX29GQLI0dAkHE?M%%^YGtvuaee(Op zp#n#X$82{{yhQO+ZA61>4&r}`n-IIvyv;E*8sEFhC;Qa+zL4btYey$=#2g4QT0uPG zqXS;&_XBgO%|oRH)A$^uLuedI#C(MNw=auc@{PkMRr2= z5u43!^t^|)-NlRHhrf#E`0XA(k~)*h4)+mWDt_mCXq>X`9@^Db&LN78wxd69t3vE0*AIcl&}PDx z@W%MHT*djzT<#ZNyKvNd6TNHx`UItIui;Dz9$%gJ5zpBBbre_hoBnj$?yq*nPG;$N zpKyY(qjhAAZz-H#*duJQ|27{p5x$n9vgklMP?px5`FsRrn@R<~9!Jk;4LOib)I)}P z>^s1>x|pAyqcaCEe)QFaAvSBGd**At9(&tm#*%1m^EmV2>XjeE`@m8~p7sc0qQ?Zo z7L-9hH)3sGurkD;sE;_p8`xGCZ&BZu1A3W{Bv-G@#8>;f8(A}Q+Og=`m z{0e;p`=iU~j1w-CS=_aj)-Gr|?+Qy_x@GGLF3xJi{kIPgsw zgnfP)`XSFI$Z`%g5S9E0`!Ss>F)EYj7?nwMk!~!ZOfWO-gKJ`<9}j197z-V>6EVj9 zmfv=s2R7>o8&S$jX!}Fnnxg0PB*;(aD0Mb8h7eLkF`$}bo$DtEE`uv;N+R9?X}Dz9MvrrioSx9Fd- z+rggTc5R)5PRvJfp2T1`>}o60N1)RU{GDkg>G8r5loz2Fk^7vk!Gmh~3w^2`4q^Wv zzFQ3{W81A98{tp#_q$!n4wTVZ`j~DD?2vqs+%@F$)2boa#`NFa!{^BMVMhbsd^U7M zeKvGd<$3t%MLZw!^M-eh%Bf)9j|R?S zfIoNAnFM&}!_VTP^A8XoMElQU$PIpm@kAgRSie0%=Q3aoCS8p!Sz>Uxz#2?&9@RyB z(r+nH{dDfb^ONxIV35vGpm$F0lapQPeLi3A3E#D}MnmV{P&`!dHqJl*f9{8~U30F- z*#`+Y`yj!BXLv3CjIt4Y4uUqF*MPkMN{t(5FW_2?Itwul^rJsAyt9zpU3gz~9P=!^ zCxXnDrSBM0ab8D~f9x!#bIm;Ai;~C}v`)sJZ_LRWP!I20M$X^i?^?Q9EXHGf3(kYf zQGOOq_33;Ctfwyo-Q`5rhi62a)=KF)-nnigA4@T$XKufl(|Lo1fR2#+oFP@E_0wJc z@A;#te*2qD-~O?BmK)?LqddZnXd=Cu#_3z@nW-+0>A^eJdLhp#ds52@lxfOJqHzcE zAEW)kkU#q2U*R3?)8Gs98Jar*ix}^I-Sc!l9@blY>oMMqzF)+7MG5#}e|Mf8?;W#o z?#zC?Q{CsgHur73f3z<)k`JYLQypJfd>ziD@;3L=+Kp_@V0wC=$>-p6@y!+9vA6#T zbAHH=_gG`j0p#N&upwPTE;r5s!#Qc<^E4L(E^+kU0Pp(@STn?)k>MFQKg{5EBmUmX z;~ku@$V9?0NBLzZc+l6~tzrSZ;ye-dBp>M>n6+L98$XkkM7(*oe(WONh({0j!}~Qu zfJgAKyyjm1JtDpfWl?m-4RmKf9#6wIrQ9MpspekDiswk{bBjzj*4*0{NQ=2ehE#4> zSSPHxSEhI!-+191Jbw%WdZxfV**4y*;M;AMh%4>;COXl$$9MTyhfWx%MV?1=1HwdKL}KG-YD3$S5hYbJCC z9R&9!Zkwn}Iwrd$8*O+F?~wPxP7BdbpPKCQcAa9Rd$Lt`?{xZRCEEKE*7Q2??2li# z+^Tte`*C! z^v<5*q`U-%vv2M+;+zM(_a1vz&|?w)vtZJgap{MKRPX-Jjh0@V6V===FMS?;?yXry zxkE6SCMlm{ZYsI26^)jsm?0O-6K;sFuijSYtrzg zp4z)y?p@PeY3Sc|b1+Zd#q_>m*y}^5WYRT%=Pw;UoO?!}LHinDw|Y;)ahxfJGbyA$ z81o{~C-Lr{&Zt-v@4GfHtudqZT4j*FMQg9cI~@1~;sI^>>ZU`t)ZTWq=fnM+9M{wM z5PRt_Rl4{NM(@eC9&Xr8?aT7g*Y((M@V?QL{gIK*|Drt>tr^PT)A2aRFac*`CH#T6 zo0s00f%bYx#?}nPl#mmCF9z>IBszN&e!)!pCafDr_CuJwr~P{*M)y-hVT#1}NWgyL zU^}#@Ad1@#?BG(qgY3xpBGUzIhU|s>1GkwsaGnfo3)r9VDp%a+^?cxheQzRLBfD)l z%Isu+e2ub;ovS_#AB{4k2h@r4D&y}%`DH#}=pQF)X#J1Mk>0#-;T;vN6*YW}F=uFI zawnf3IiW*6)va5u`Xcf}t=9n0m$H)h+7r%KA^9-AfDaw_btEVGAuc2A9did0^>y9` zoo~zA82oh$cp)Czi+Ehl*Ei5Vm(e*yb7Zn**n4&rbH8Ng`)e$HSkFOQSm*hY+T`nu zd<+@xr~aza9r&GPc5I*b!&gZgcY8~YC758!)GjOnw)Ya{w5+59h)oEV2B z?~@-H3HP)?(A{dM_f}DS%)#0w$Gmg0i_ZA*;jAs#1NNFo>C{iDENtf-okNMaZ5GX= z-D~hJ8+@Q#;?g@I6L_(vVyr(#GLD|*wdsu7KRwd>M&BQqq54C1oplZ~=Dv--xqp_C ze5h$R_MMTWSZ+r-oXnl z(x<2BE?3=MW5<^EM^wK?x+Oa&{f^Ni`LrNi@^iV+Hnl}q&hly3JbtodXA zl&=UhOQRPp#Mn-{#C~KWFfw{>$;R1S+@DAbH!&0K$yu*g25TR7$cWu!dbb7N7DZ=~ zlHFJem_XMtIzwNeHtItBJ{JDdyWPHs`&hC?_*JgIx3EVGd$rI99Q^F7{CP&twe!fA zNthcIQ`?QF(DsG_v~3Bro#;Jt0q<--c6t8yukG2w=91monwC#&VmExuX;D)oVrf7 z8vaP}JXGMwYr+_Sv*|q7Veb>pPouNb@ZCO-OV(e9u@m%Z4;DWMXc}lE1|qsd^D)Fu z6n|2znYR&s|C1F)TKiakJ?s_dq)|TfbB_97O9T4Nclb2)OZ2xdajX;Hr>FKw*gubB zCL?|d_7xY|81&ue@t?JYy;RZAXF6;!8ag&F9W1GBtz&UXF^K=LH^%*>I%cDvCem1n zzM6u5YJtC)4?h%xb>v;-2bP}JW#Bv-sf4~AhmUKGrL`5d-J}UOI4r1VSuoow- z9r_CK9p637IQwHofxn9ODpwh>r%h-d#`nZ+Y!l>~pVo2V*LZ&z=k3Tg#%8e_u$PR{ zKC;%kcwdU=J|BE}e03)HMKkzGfxomsmUQ?=nQR;P66%`j1bka}#)0#k7nZYK_7g7e%o=_@y`*%bP3ye%p{->#-g9G3ts5P z;1f z!R+1!Kfu3t+18Bl0q>9m3(=wXr#Z?`7En8$gg#3l&RP2@?%fZbF?!}4bkJDj9m3wC z4DgBe5o;K{7cRK?*;geW;GLJgylyGZ4a0M<;&AYBbSvuYvg6FiKN#D0<2*OeX#a}a zQ*px}#?9A1b=4n5KSvBlaRcV&XK_Bbj58&T!L+Ge&>#2D(x*8XbeU2QOdEhbw=dui zT}C$mU)UJV7vp0x&JbgXG!9w{VCy$AeLZvsn=_NmsW?5$agytY2RKd~yJrhgCyLr= zMNkPlV}u*|V``Jy1Aa2KO&GQU7yR^C>-|<9g4=~1^-#ZteaN0`GuO4De|m1np}mpu z?jH2rSoC4CA*`djzfN<(W>R2Rmex8J4Sg<4(!*{x1J5>LIbWyl63E`tY5tb>JnfAT zoc>sTK5TCx?N5XKnP`3p+l@;D7VyQ1_@?z$#M^wYCVapt@A`v?sRfz*0{M`%T|^6g zCQseZ+}Mjf)^*T7FrsyV`VX-Oa+v9F^WjW({tXxQcs~0FoS_RkyOeEhc;1HRz;PjP zqiP=QnO(LPwMT`&O(A)LEc6jL&=@kzYpGjfs38P2cnlVRY}aE*N0bH++Tn^=!u+#wN_c zS(}B}uZwd7WUSR3%zde5ckT<%@6O$RcsJQ)?sK8L>Fjgb%T0Sw9IGs5M-zT;S zHQl%waqgCICT>Q2y@g^Y8Dpq_4vKpL`6Khh+?W1yx8)dUoH5U`GL<&fSrlTS?-z)M z5L9=x-u7oRa$f>JK0iNwboLhLyhFUir#L>bm_dj5p!Rj3gLfi|8`y5(`|^2gs+4&f zOf;USc;cpEZpP2$ji)s(_p{TC{EYeecD^_0(JV#j1TGk_2gp9?Y*t{CLTflwp3Xk~ zXU;hdI?Hv(cb?@M0p7Fuz63gxl+JLab4kzPN@tS};5vvaojrT;S+2`@%=o`O%e6~M zAz4W_k`wsF`OjuGxL=%(aa+jc=VsH{@2l}{yp!#8_rV5z@E2VyCe{Q$uo`{^=PdK{ zl<|JXy@8o?-^6}<#9;1IlOE5@!Fj|FUv=1h+IraCh&}eJ?{YbsaF+1HGU+9TVk`eS z!Z<6M=Sh_3K8f>#AD;BMyZ9>1C1Ve}Kejj=XHc&hd+n(n)}Z|7Y~$Mko+nYByV>Ee zpbxnl_1rI$ACtSVu3^I3;eMQr?dKn7V;^jA`Y3&7{cIGg)=oXvd_XE~Qf zI~*m%XFPAu{T#K&&w>V@JWrxLI`i3cJ?e$qz-J-m-WJEA2tS{@l$sGfcPXoZ?=rGM zH}JIWQi?s->$pStUDj0MrTFX=N78^pMaP_`M*5aW9ia6WV*%D#=f zPK()l^p3;cCdB1ujvw}Zc*L>f0QlZoK=Q_UHcm6r-hc1<0`d_?e|{A5hUuASYk|YP z@vg@`#djR0|A&MpI~Hf67dRG`f(D(5Of>MF4gEhOyzA-PMbJ?5qmVaD&+;V1$yi(Q z=q9;5I-Gxv`HFib^c|5&YdXhZV~5-grws0UvkdM6*jXdaXV=3Pi_*!bkIsuBFUEk8 zxiQ&dtPI;+lgrO=cYm7sIO*8EA=k{$0MEp^%5(-eY?bSq&hSpa8R%2~34Om1?{I$t zeUqJ_p8G|djr}au-S-48_@JPT|F!VY#3 z!`P~W>W{J2CF|~6TUfOwsi?9%xxBRW{*tQdk|bAo8B_m?ORI}2k-09Zvh4n(iqeXj zl8WNWq>7T7_S-69i00wcrVNz|MIWDm-6TG z56`j?7Wps8p~jMi!2b^s$ovkOzw>!gUhd77ZzuAd^}oF;fAYVr&sgDR#4HtV=RV%a*({bvb-d@uzGcJW@T|n@~!?+!cn$%RcS?X zbyZPvd0}ZqQjyci?wT@dcJT zk!qS!jmVg>%8L9#r!yY|8tRRvt7{6Yh+9^^F8{VAOBQBUl@!*LWL9Drbn#J7QC=8O zl;<|9zZcGq-Uspm*KK=I7PAUUZ$r747pnI!%eb!oCw~4m0`$J^`Z9KAzx1j~J8%sy z`_eY`8Rfm?9K9b?CVe!2hh_9WxXh*QUxbV=y4CinZTh{4HYhJp{>A0${fjY*vi%T# z2H=7#J%1rxy*__#wEQ-IKfsy|zImg+tlMs8r4=jLZMNH3MPUUq&zvfhY=AAX^zGP7{*+Z*B^DcJY#bALPkGRM|+7j7%Ojb&A=EUhT5Sw|(4@LQOfpLzSj zg|^%U>V57V4&3qkTW`N@L9T7_9aQGFyjvG6&VmEMeQwsR3+Q_5f+b6Aw=7t~GHq|J zyXlyZ-Q3>u+G`;dSKey5U3Yr!`7iIRf53j;e9f%2m*4(JZ}l7LbNh)hc#ZR4G5@DO z`Ny()eX~iu4&2MHwxmWM-Pnr0hqw^eCw||^ufP6v30>!j-T5ZE-ekZ36kW@&-t-Jz zpD}lQBIA0vcki_=jAcfx`EqIsu6{lW6yO8a`IrCX z8rN$Z<@q^RpE&%{XO8*4{@;Y&`n$IIugwsDbv*m;^Ut_4*Zo)LPBamM-&Oc|MimxM ze-~*F$tJ_tKmEv`Ki|gxgiHLX1?KTT@e+UZ+yo~6_5Sp)JbQ=pm7>b35;C@bJ^nO~ zGz2sRGz2sRGz2sRGz2sRGz2sRGz2sRGz2sRGz2sRGz2sRGz2sRGz2sRGz2sRGz2sR zGz2sRGz2sRGz2sRGz2sRGz9)-5qSB@FCKJMRIjVX2ND0WOlpj22xtgs2>d^YK$tGF zujPNbzqPEisHCF0WKPzSOjfwIW_4xN9R96a&FYfE2TH2(Q3GT2y<2Hz#hm+RCegNV zR$NkDR8{J%p*(fRFk>s$mX;OQl$Mv^Yk+d+9GkPsWV*>T%RJL+nl&rcd}HbjH?RlR zI;-cHlV%c)io)`eIb*+jplkt8aB4S8#C0RC*kiq_0M}6b@TE7?qX>QsUm4S1)u1_bTc*s)R>yL`J)9&g-%5M`_5#iZ7iKxZU;}3OaBeGWDKBP$>b{Xy~aL+dA zBS!9*hlGqn))bu{PsA>2?}<>M;)Zi&p|%%uCVR+tcCU9 zUVly4i;zs1!01DakHVfq^K1$wgrA4KM9sag=U?C5ik$1H7S5g9cn<62hJA#jeDG^1?Iiy+C4~uQyaUDjJJCastAkmdylir z7~0dXkCSdfd*ULhTq#*e&0I|OHz}1Ts6lo_O5+J?Q20zr=Lu?1S1--s2?G-Po1_e$ zFjAejrMWy2O?8?inI~eXPK9LS2^0Gs$}vHbvWbVs@hrqHNuP^mA3I6Z0QnQV+l9oa9NrAcS%W zV)1k7mpn0kV*ZMiOnRN#3MIVRLaCS6A&A+3NN?gI+(Zzw3hC_x#=`C}A)(tY?f*U! z4RJ_>oRr>4MdF2cB*azHyHspX;>7&5E12{iCv8RoZ2pF`X+Z*f9^~z$6M^dU&=AHx?=Ous?; z2 zy=_Q|I!Ro^Q#+6n1W7F8sh#xfV@WLMsa|>pJ}Y=?FH*X7l2{3F*pvh8D!{XrK=~36 z*w>Qyz%(@dGY-m^lIVhENdL#hz+H$#5}oJ``d=WS&y&P;NQAscC3O!<;vBAMN{J1U zI1kUH*#su5M+&}4noVGa`~@lWFKKoZQbL;~&gYC6C{-+p3*zzYeIu28MiT9urkPRz zB?|&bCsU9TDZBjt&G zlDLF88(xT%euX6dfR`jy>fe^crGQ0{b18MVB>oW3^gmgKPtt9maI>-4v2_k|#UJ~XKkt!nct|Z79^`t6pHoubu8&8GOvrtKx2UOWzQJl5A zP^^BGRpDl&+j#ma?)xeI3{QuRq<_ZKS5g|T7Iw_j*Km4?NWVXt=Jd!3vBYQw`wTfs zJWC&4hkph*c3c$cFO)6xAUk}*D9+)RQ+Bu>4TYV=&2&ykWF|l}UD8Fsd*~mdM4Y6H z1PuD8XuMe${v?t3DehTJ_)}a}pdiSgP|hg`49|q0gm-~J_}x?|JHh~G5Wb$XAtOik zNW>tyOS%^aB8I5m6x_2j5kov8p!<}FAs8Fa*S!uW$DTIfI= z8#e_tBZX_GBL^a@QSDTGHq3-;QvG>wfNaXtvXTnq+5LI9;hKFt%5RJpmgv3^mc$FW zxa7tQdAQ^;My-Vk(bU>Wt zszD^G7VVe7pS;R1p+9-GpD34~nw=D!f&Lwww4l*zMi}=~xb`wYl8!!b-Q@zcXG&2a z;uPmzMNeY=SsZgU>-*3;n;e`kLc?)M!rZF@>LGQ?(ND~~il|Nr2?Acc^5^rQ=c&jW zfy|$GeRI74lXz?%nvLI3FEBB>bsi`u1XIqsYz*yb!OupX;D10prcE+H{~vV?{12Lz z@C!{G_2^1l15d{m$_*}*`z?jg^LVe~l=3bvG#^jzQk%nQ!j@mMIe#H)ZlusRn!`it z;w(+2mWJE(5o**kW%YrK+xa68kl=qY41Nq9NlmF;l6;c?Pn=KBg}r*=!uWBB>I4A~ z@DnaN>|kkWX`Xt}!IE{=H6`VA+yP6jbk-ynm)yUmw8mLg>A!P0GLxN^50q3ni)NG* zt|(0|ttcv6i}Mo73yW5lR+RiVYhg|K+iR4Su1H>0R5Z3dOVX?)bD-64uX`yT*>_1z z%NzLtfhd9Vd-#bA{L}~FmXGi53)hy_TWM(40P67a@d%To!U! zC@!HnAx3^p4vEH9NDfI1{XRXtf^w5W!b6iouAv7rO(C<@Cs&R>!EI8=t)VL2n#-x) zq|v9iO(N?N@^NfLiL10Gzp!dmHAf^L2SgO-J8Pjw++ zb5RAfS$_G7Dh!lVVl_{#MTvLjM z=9S_A52W*J%JUxpyVOE8l&I#cuEcaSABESV3|KCyq9lrzmsYU+3LJm|rps4USJhNL zP*fe@N2P#Ol(I@3z`_4nTR~!$6q|Tsh1Er*QdQ=v!ir+TA;0?Otc44JR51k4SMMuV zuB^semHd+OlB!iD6-8i=TCXlCVoUQJOY(EL0WRj4(1Uec0vIWS(8a1YiYlG!pop46 zRV6h)q_sKFxxcV%Ew0WRs@Y642|=nMXdnsXK}JBH@)bc~bLn|AkSKrUT51dGAOHg8 zK?eq5{>~mn$EE~zp^}RGORFk@>q_bz#0gkg4M{3j0Fk1y%4%Y}y0{cQ3Sau?6NEpk zgjXR0AbqSVEH5wQ_Jq42@Hyry3Q>I&ubaU*t#G0>bhI+`Dy)0nkJZxoKnfD6CXlxf z8YDzGAOZPSmX>iFCWuvvORGw2N=8Y7*^qQF4W36X}tH>LnUZhGh& z&>w^#9$CJs9B#F|FIHnsxQ3f0s>5>0-14ho)?~2XsluufND5$stdV0uU7v6y4X%J@ z$|_f&kC&D^*H)FNcF4`Oq_B#usH`kQ&#x>hEF0|pd%AW{io4ofL2BPY*KQvqrTfVH@o;YW3neWv`Sa6stIwz(Q8SaJZM9g&tO&U*v+es!IrSs>FR8WKo$Tx_Aa~ z(bKpOtSB!m!!yvP=Kk>?#xja5@V9Ci{fjjIqrX)J^e++^+32sliT*`8jINATV+zO9 zSh=9TY7_m7=QKIN-{x-m7iq-7^w-7zMVcn3`0JACU!-Yy9)Dd2=wGBUub{uK6Z9|A zydAoyKcs0rVB`;J<46KGNK+s`@`p6dK1cqL4vIZ_d8{)8Frau$`5V%Zfy<`{I3yp+ zRFvU59%+()4$^L14gPdp03YPh^M~-`e|~!H7o`ElsvXE9`h@RKk$yEO{T9+YgVKM* zJ^%C5`!k;RAR|y8Jg@3Sn)o4l!$=dJ{^x>UX94*H1oY13{_=PxOhKCD^UEX5#6AC0 z+Y>Udd=QVxpiE%}{#$_Z++I+K>SwE^N9f~O6=g-CFg-84=(!X89Ykrn%C7({@8|TO zTwpIWGxlSycYhjDybk4=gfzAP8cxLSCYt`|yYYYFjSfm5W$Y0-D18?6OhM`MI2CpC zXj+7gJ^=Xw^u!p(He$v*l1>KweL-p9QBO&K`(i#$WbO${mx5k*P#T3Fu>_?b$En9h zg3>=@>_^9f(tS8h$`_RWE&gu{!SvBLYEWjRedzxQ$7ouIaCOtEpfvQ|6eOQ+2HK;? ze*Sf^=eB~N^v%GxB`6KrTe|&eV5NgT+g}ZOelJdH4#GTQLb@m6<{{Zr>4k~{N&-;R&U%+~ZH2Pc*pYlYY{r_9pyTIpJmWTgO4lMx+ z1}GR1A!5ODs_B7J%E6pTAZbFAwgC#s+vH91LX!9OeUmmRr*Jf!3lu0&FgoV?bIw(V z+BxShI>tI>+Bv43V=g*$)j91pbe;3({@?4m@B4YKg!=pc|M^(CuID~o=li-3&--9c zrRPM^Gp2p%D)dur>cj8uT+&}@8h&O?`TgLbT>ASM_AzP7(cc}m{LeA{mnmO-ap?#2@`>E3dBwRp{$bGX4VgsqUyW_!pz- zBl``04f>xl_-6EP$HQK?+y01OcL(}}o=*@OkXcl5vijeGKa8T=Z2NuK+X2)6UoxH@ z|6e$`mG*D>_P<2ml}Y`D=<6=}2==&e3H&cLIQDt>9)ouxKV+cwk>A46C>po*C$Y~8 zQ~zP~XZxRyqKS4>{z>pAgMW$D+%AJ3Wc*5l!_Q-e--YP!e$(GE%t22bO6nhTF7YB~ z@GG!~&>s4a!Tu)qnsW40F#H^oM!vJA{7(G;u)&EZi|zwooGWWr=|_Q1N+=(@Q)ME_8Xk|_`+U~L+^3e;6n z`eJA={rv{{EKS-U&+*9CP<|XK=zFk-gQlFiqtG1eO}4;y&3c^vj&H!;_Ly?yabKmu z2Z>kwi`zfIEfn}GTI1r|@l380M!v^mzgz8ie*nGG+}r!{e}VpU2LCqlwDkT9_R?j_ z{}1$(C-|ZhnZH7P=wEa`@~klBm-4I+ywk;pMez5?xGC?zKc_t|?Qh23t4;YWQPe&I zKI`~fl*itVnDU3A-|)8x{Xb*-|2*+e+IxN%eFOO(H26OdU-uiFeCEEM1V4c}^u>Tf z-wE*kM3pH&m-*0)cfvCKr`?o)2zl=__y+9ru)zmtZ|FH82fb6K9Q{79%izyrKL-r{ zd*qYT2FISCwB_GHpY$2{KY@62TbIG#Ca1ziqNPs0s583Dl%M#1=JUfz{S#NxexJe7 z=L2TE6F1Y|;$y_4c3&U)o%j*xG5nqQ9OaXy{L|Qnpk7}m5|1Xz4F0#ocT3MtDL-P$ zf64f{1b-LtXZwu7mx7!A-UUC;>@nrnkRR?c_)Yka>Hl5mYqZjoGkI*Y{oRYarcL=X z*!K>P!~eTpMnATH=7-0sP5l|>6N~>9{Xuh($GhG{-dzSqpD%{->A(C~>|rt~FDL#$ z5`XCTILa>}-c%U8hWXyeOFoS_b;y*DVDCoW<&*Tszqr2_slU(Q@bi!@e+~JRn{xE` zNRz>T2!B-u$N%mz{c#5Cm$Z)llithxuq&y5(sJ}|+MjeS<);6Wh&{WfeSPF}lFT1_ zO#2<^XRj%z?o;ii{FBJ%puveJj|%GLdD2($A1U|w=}GwCZMJ{P?zHs&oc^aw`~QOe zr3rrW8Q9}tgRh{z#jnO*noRiy#xwn$jD1e*Gvyzq{ThScMm&P1K>x|)JEPMEXL5La zkHPWBI}aHA&zV0b4URr{mKz*>K5Y0s`3Uy2BPl;+A^My#IBLDO-QXX9o>_xmMtnB% zIR)N#l$mn)eLQDy^!q@S!5?Q%;aODg=ATor*N66+^3Nh~+ut`CZ=Wgu0rnAa?B|rX zsc-mOd_ojGJ)6{D{66Gs=vfRcFCqh#H|-Z+MZ6m{cq{QG;P~g_jo8DiFBd$6Ji_>b zZ^yn5nDQsEhf0G#=l8QJPSX9X#k75@xT-i4TW84n3!p!%ursej55Lhvst*Ir>jq zM*F3vd@b?Z(05ub`TUG2Uq`&HHh4efl?I=p{D{Y8{7=E3;b-xGLeG9v|0~2tJ0A1F zc(p12Ir=mFpGJJSw<;-r_hQE1VQ}kh5rtE9QrEGCw}ZT+XE*qn zPCga)GhU@Be+++A9DiIy{g;W4OMN;1T(J-R9WXfX^Pyb&{|@q*HRb5{>B$5?9iO_t z$>67B|2czWug~{*oc>N<%@?iVIoc0B$AF{nd%8^hoA8HrQ~yrv=b$Nv*V_Yq(0}^x zVn0)+9Dev}8-M6m#`_EWJK$3PN5r!-Qy=?$Mo>SWa*-w4CiDgT{qS3EaOl6y&~pay zWxL_`4D56Jps7C!e>)7$y{vQ0Xc^dp8=MV2W2Y(tg<>aT^P5& zehcRhJ>aGI-vaQv;jh}1<6n0O>h1r%#LL2r!M{j(mBFF?VO#zt`5H2g+e81Tkr&}G zdTKH$KMR^3Z8A6&?z82~vF906-i$vpX6XN{9>y;>_=lOl?RYzwk7i9d@#6kTgZ~-& zHu5^_`^4MBru^U0pXvW>B+hQH&n|Hlk|_Or|%drke9i4W}tC!XvS)a&=`|IPeRAvpHH{BZUg z$lu80?0<#d!%6+hGW;#z&|i5GrX=l`IDe|VB8qwsu_np6`KYpyc++Fr-vB@K5yr0^ z!X7L>hQH64@*T)`+TiGKpbK2=w}kQcQ9fnLk;jvj2LBfP95MJmah8WnqA5==_PLWW z0zIfN+F50A=JQA4CoX4x+qvK17c(F2G5D3(OQpeEp{Ly7#KT=>2JfSM(BKp3zun-E zV!xIi=7-zYnDRfy-)w#1ciNOQ-#tI+arE`Rw`p(cpMyQ$)sxhh3zcQar{qgcf9Ejv z?&_rdIrY@9H1)41Ugb>r&E)61O!@8bH)-(uiSL4n{Xx$;Poj!hj}r^d`91Q3a`2_- z_ZaXmU>}vH{43-?L7&ndd)4#uGV0Ur9I@9xkM#H7_*YZX{=He`zu)7ummB>9_kn+a z_6xvI#a}Cv`tL^`*Gqq0&|5_L#mMiVDZh&ODD=m8@4trmdY>uZ$aw-|1p9eEeeE9i zxQstV`yNxi6Z#Jr9D9GpmVX9)?(*f*9(mk1W9t7E^6fI^e}{j}n(}{U{7F;(Yvfa& zlrLF~d;?DZOW^GX}@MpS1l0-*zA=KlfPZD>wKV%$HLJN8iuw z@i_dS+lYPy_3`uE4fJp8catv}dd?k09+Rd%W!rcbx2NsH`wfmiJk)ORj}h;C489lp z-Q#hg2mL>`)Rcdd{wfU)|2uXW9DlgW(0AS`_+M30e%|@S=Rt$7#hzw7&UokH|B%QZ z{(wHtgVuX@7#w}?s5ba^>|>3=AIDzH4359wZ}HclZ`za-ub)5YaT)(7&|969%ZoOT z9WnTM=x4vdS5Uvg;Md^~;|5P7&nAQC=x>d|??xWBzeky$s!jQ)$+wmoocU+F9q+ru zFC*U%yoG)bnEG#HucrOdBIrAmlrO~}x9>Cf63Q)JL#%$4@>29c+okZgtH;#urGGQt zQsUne@EG*B^a<>x-QdKV=bJo^Y?l&mo(uH_$N#ofn)<|>`z^i1mzVk|Kj9?3-?a3< zh+l@k^WTL$_9X4kKRt@p6N925NB{Zn$9}3zIrjH>m%*X!(ftNrkG^*qoUxx-V{n}H zu_=S!i#&H2oOrW!+~6O>o^AcFpl`+u@;d)V(6iLwN1&H~q5Oh{*!wPnpTT(32B+;K z)dpWp{M~18^f|uY;GO8x$m4<@^mV|L--3PuJ?Q6x3F4a+d;h%PG5oj8<5K?2s*h9H#5A6>Q8vKXY zQ-#6*hw=jnei8YAd)dg@=SAn@zq6*C_10~b2CrqkW8`yD8~$SPo8W)1uMhnfjUeA@ z(;ogtCk;-#CNEB_{L+JAU zfAN#pqis*VJ9@pTRFe{(_1;;P->*w{XOiH)C(J2H%W4stvvs ze2>9*uxy+JU*pybAAAY@Lt~Kl2S3Sp6&{!IzQ}xG>G?YTN*{53?Dg)+1g|PVp4A4g zL>`9Us^!pgz?6T8@%I}1TI6lZw_x9gd^z+~5iDN}{0RO4@g-;46EB~gG5BYQf7J%3 z?Cy4h)AvN+7k^z|iv3h3<;#JeE;BgvPpvWdHP~~x!EZpHfj;RE`k$Ni<CXE$)DN{em?V?p=ZUF#0Oh`9peRl8E*yrF4{%=O2^-d9QGdQVXPIzlgA7{ zD|W*_bpk&t{uli0F!&$SzQ^G3+x7YIru_u;F=pUz zCH}Um0<_%s_xr^E{igiSnSYKL{I6-h$KZ#^2W|PU(5LBt74dM<6!ohdKda6`etVPl ztJXrF@Z;m_D&ohu&=c@Z@Fs)zP`}LJ6`0YyYOBP@shMr3h)9tgSoc!hvL*FGA;Lit4c?0>#euG2n069r?)=9cwa0z4G zTW!k6>F}uf{$n%y_HO-<|Lj##?*m*c!n` ziZ(m@Tm1m-XH5Bvv|r~|(9zw8XohkDRYlhe;-=VE^cO!+17(`0bwhmX)_(9dNp$g9WTee{3W;92VL zHTV?zE;IP^*o*BSd;G`_Q~qV-FQ~VN%f88r(EG6OM?AfM%X(+ll>Zcas7&y+=x@8A zzWv%$$TucEj{U4fpU)pM_%hr$J#uGH~gRB?Ic&|HotofppQjT zzsb#ySHRDs&=}~s;&$?paf8Fpi;SV=GX7rtufmi=@5GG3e};UH82mT%zbnD7#0MWW z^j?X5J$}%Xe}Me4%HV5}pP*i!R}$}^tMoYZTnRs86{eiNpDi;uji2cr`{DAl~>2dUNwLM$YaLf>xqvCJx>2ur5SI~;05S|=OCY}9%g)_&#OMhd}8Er)eQ2fHub+n zJX~Y&f2Dj!f`15KdBF7lp?AU0ep7xH_Gb9`&G-KV8+#Zx<@8;05xCFyYS$7E%S<`^-m%Z%n~1m79*5uBo3YnHQ;xsw z3iLpK?L*YBF!i6tA9k7gFVWuCN8gHidDngm`;_Vdf0Ot=nc#Kk=srVV-D2#+@L#tC zd#W_`FG2rZ2Cv7zat4RLdklSbl$}V9QsnpJ>oA7)HKD`+CNDQBaWw@~?-#$-}0+f%vw=;2V(tjK`&Z5A!Sk zf;{Wd*ONvb^~95h51Dd=|6-7*w8vh@EIs(+J$C$`qpyQW`v&wgRcY|Eu-^j)zYzb~ z>v8&TK-PCmnesmTsmb8?A^%x}Ka2fWdR*G?q5T?Dz7Kg<8~m@Zha(36C*)CX@VD8o zsWSMlDW{Jhuf|guFVtte#`mE=GhQS1b!X1hCtr%7Ihu6-*Vse8e!!PY`%&WY4v*t6 zjSmpdyA1w2$hXqqpF&=TJudCPgnp_G{#EGPW$@Rr&m$g}{tqG#Bj3hfvW6Sv9!+RG286}k)#|0Vmu%N&1KUj%@9m*^2l1rKlz*I`AL3cjTTcGXdl~~nXSFPHwY&-;&<`oyEV1oifN&3DKb z?07$hzd#@McFix4hrzF1NW3-uU5h>^O@G%erG2$LaQ1pF@Wg(Dqt6%GJq~@>UQhfy zWXf+LeC;y$J`xTm!scVk279N4f^OZ_>IJuX^+!?%dO~d*5KIl(>n|f zzYq2#_y+vtq3Q&0`90=~BL+v`cNzX$;P;+cQ~o35A8_bvEkWK*NqK7p`m^}^h!1;A z`6|k(6Xel)74dBpbcyq?))wM{EleJVAGYMY#DfX{7gO`%%V>@l| zdq*gT-?jx0iDGy+3F0FVlY3;9tjoEq&i6{x+HN@3a0Bdpm{ki9K!q z$$UAOl(!!Xf0YIYzJE5sPs5*|G~>5p&o2qRi(P;1==Y_cg8Tb`?Kcx&b|vlG8Eb5h z!HG|IP8)nD>x&A5Q}^C+gX50{iyy>ajDFkk&mB#s{;!FzJqdo@yU<6q$I;JqXQS^O zrks56e)y4Oap)GHxMrlcpQ1GAEtg7AA4JW zH)U7w&+iwnM?d$B`}$H&U)y&X{4@BIZU5)=XXzz>d#v2lKScbs^!$o=W8~36-4`o- zedy~Te&2H>Y2R@<^UsvQo6tunm-;uNuY;!iR?6E=f43pO{ighJ^l{kWzl;6Y_J2w| z%9--7L*G8rANjyXEIq`VXDyDuO_n9?JF&+X#*_B)bKlP%G386aCk@_!zwa=3C*|b^ z?_+*AMYrNc=SXb$$+iJ8bI1-+lWH{yq2$^rHVx)+0|F zd;>A%nJ_-(8{SWOQ__9|`r0{Y@N4mpX@ir`j87T-7W~Qf$5@Z`nDR#$Z`$A=XZ|{3 zaN^_RcD%oYzcr@(pRvFF2B+=wT^>h%8;g+Fw87!;r55mayLh+pEanF(_VV3$8T^|5 zHnx(#nejFbP=3JF$Np|>H~78e9~Pe`9_};ce*`^8JTCNo6Z^IOVQ;t1n)(vo_a^uz z+B{_Bx#?8sFE{1yMIL7SP3NPpaZ?U|PZ)V_LKYL1ru-)S&GtWpy<41kKf2V^-vRxW zzE2S^W=;8@(LV5tJ#Bh}{L$jX`>|?M|1k2I@;JP168juX%DWcP-x`CT13eaBjlIp7 za{O(~(A(7of409~@Cs9Z8}hXM;cvT-_;Tp!`XutTGI=QU4}AR+?B|dvug7024Za@!XAPdA{vLx*V&6(1_KmEre-eF^neyKu z-uD>%i_p_I8moz@J|1 z@;Lq9a6R#VjVZ_8#;Xi|2l@~7rT=G;$BZfe4D#4vaPq~;eFn$Ap4n^gUw~I8_>HHa zf7AZP_rY(V2l{SYi+u;2@o#J+o?1MO{JKnk6ZB{FapQx~J8Q~cAfG#EaPo;qCk>9j z>_Ub?UN`Q?eg+Nx9qjFZ!Qt<*oWXxie^mxYU$@UB_~r`yf0x0}L&uC!bl9yQHZNm7 z+H1;N(9a%&qpw9h;9c&#ZZq-l4#B-WZ{EuM-)`{xC@(koqomDK;C{br^K;mX;cxRF zK(CaC{=R~JuQB+yi4TDu^s{*uek{HJg1<}k&>sFD-ca!LQpDF(Y^zJwKA7d}G27e8E3H)JiH~j>Hu_qoKYE>nIv_7?g>zTMXlFRD%X&G3K7;20Ao%pd+C^&eq9G465b z>3)%TtNpon+l@az-EQjR&o54!`hQKloHga-FHaeHcjLcz4kqP2fRo5HjNh{udo%s_ zz~9|drX2pJ4jUZ(K4ALq=|MiWzftUA(A2*h`P=q8S?{bdG>=2 zvqJ{|G5%6*@c%}>(+Qp`!+t9aei8kd_NiLtTZ`Yo{N82iqo0pd8~h>Ww@QOg(|)hP zUqK!`3-qS&w?(&uUg6?d>J9c&M85vMO6u>CPc^vbFNOU*V(8t1{XNl>lyAWd9@$~= z_d{RK;H%K@5ra1qFJ}yXBldj2;2$QR4ehbFEzr92uql6n_InJDJ>FAg@GoPJ`wR|0 z4_NyD5A%nSZ|@1nW03moP9DAQL4RFI`(E_(Qn}zTil6s3!rv}a-buVXXmI*^X3F5V zVV}1Cv*>$=DaU_qn>0A|KVD|=Zz8{Oga3g3_8R;@@fV@r>#Gl$-8N(JGw|m<28W+T zJHeMYe*2j3AL=sY>#(;;gWrt4ml_=X++oXsx9>OQq8~$F-$$WeiUWOr$auED8F0g2 zAM^e8SyLZ>db}dR(?$3rZ9;!()bd=9$KgGF0rDs}<@MzIy9|CU^S$9WogyCD`nO>J zhJJpyJK7ogCmyCBgnwHOzxUYozl(k?{zckPoAJLzJQ_6k_u;q7;LLXq>@Ya?`sCpR z?>`3nH2wD@n@1~6IrHCL2Mvxsr`in;e@`DWIR5pZEk|D+Lf@B&|H!)kf5Gpxss9D! zx5nV#fd9P)Cte^D{%DW9`hQ7$*p=V|3(#MW!Qah%Xz}I9%hpGKFC6go(eD89;-yc4 zAA6GS2M)l`t|`+Wlh;E{27eZNs4zHfpBOhd^iLf$II`Jk_!%t49ww9WL57_W`FQ>Y zmq5=_!6{f2MT4u+@3i2K|G{hESIa%#BW3(u;p98`1o6VifABNtyILyv`ZL(aq`{&0 zBZi;B?_$4}o*(jR9OXqr(1WZ8e}Q~V`*bV$S5MMkW+C*M@iV8f9@y{8k$2`i=JOyQ z!Pnr=hfVv9ussf5?czzM4|^2c)1R3jKc!8K<3CSy865k1*kJR+#p`hdvDdw|tKJ)uujuJ+(Bh zKb*>p=!aRlZ)jOwl^xm||I+^rH!NStH%n5vTz7he??w!4ZCJj74{mH&SJ&Cxwyv9x zEKubVUxlw?&jkSbd)R$lF?;f4s$Fi2XDn3Fo%0~<2hw_*8+Ku4b(jT%Ozpk`>Ob5KOo*uJ4* zyf>}iB&PK0^k@g)XGr(S_Z;FO<1=E8cu2{W9o*_z4>X?>xze=yUx zN_ux6|KOV-n=+$=?b$+2VSI*WB#K8&sx*N+5ALpDxc3FF}Q2Uq%&Ekklb+Z z%4k!4BVRkY8j&{h<%s6A6t(4B3rsh!v`lKJphy19=Qq8z0MvKhmvw24nn z*N%;jW=C4nBV)o;dbEbG&18C4uLA4LPt^2&cr24ocjPi7En>sY!1ePl-6+Iy8W&=C z7!c?{_;8OXPYguARn?m9bF!gh>8+!8Fx@vc1d}4L_3rB>&3!tMF_ewjA@m)Mq(||q ze);x?bN8`aH($Gw@4s{tuVti7se$ashK2&4F5&ASHF>^swKd(r_c^d~Dc_KjuZGm| zm6W{KZ7>h9zQh!w=Jq=Lqn(eTVD)?qMZVR-=U7Gua{2C+%e%)BXa{CcJF&i_qd7wV zQc7Io`$kAb8f5b#PW_rv!&do*NNYnY(#1T6Hl~Iev-zfUDyQy{9za*=eB;nqVbJ-6 z8Z??-9yPahbhqWwBT6PrU@#LXf-gFG#qeZ(ItM9Y33SI09r7iaIzFW`kY1M^E+8n;p;rY zzSvvMNT13(HY*{c9#xN~J2Mh2y@w*644sPSH;nWlpT_*KifAs`?fL8gqAtYNuuVRs z!#AOZbE#2l4vig&JE}b4ZlKCo0g`g8OHg8DVZuQ~4e?@U8rY$b1zw9@ZfqUR_;NmvwTTPWr}=(QVbqP^p3h|SBrb5Ew$;j4 zlrm~yj{4Z3SFFUKAy#BxJE7*&nGNDs+0>*YGhez7!^HI&!IA^)gqE*>B50 zV@JBT4u`)wJ)(ZEAvm^zSmfSP)qF*sPABjgl*3fF6|wT9DV6Wr#za$_1?c39KVhEr zl3quw7MZqfxrNEs>2eNzJgOydZWtMs2_SGo&vo1S0_`#*c;t@jv{9;H6(+OF|Vct8s7w zv1#I=uHu4HE?1XNv5|(&hUr{=jn5+zO_&!c!9IdG;FOu6KF_R@m#|E!*h|e&DnATM z&4q?+KeNFInVWvJEW^k6+!RT;tObt3G*MSDqNWKw1V8%_@oXSe!}HWbo% z&DRVuP6^%;>c;YU>_+MZg-8ju;3sV-Me;!cxu%8ck%?XT{7XsgyJZaKec%i8I7Zc- z=_g0#^L_qfZgZx)WX4^72?5Ic9>zJ28*QrJ&{rUYll-){*Qd#H!~yw&AUfttSRx6R z4EW5^=K@X{n%WiIyxB@K`NW?$b4mO98YNrRJ{SSrlfk1b=4h$x6wyeQrcpqv`9Y{% z$G0_UijNMadv6UaOAPBrRn912#m|g1h$AACRI|@j*Qa~am{=G=h|~FZy-yWZuFzD# zh1t3+6AUS)W`V8!!#)dCr)?W)PmN@HHKZdanVN)Mu^Jbz&^~i<-B3nC#5=NeQ6YW1 z1f7Yzd31|rq5Z?dz4_$`?OOffArs9olQ~~S6z>z$hCE$VWQap7CFa>>J!wH^M59w| zoFp1*O6p29Z*C7ogIt+tS6Hu0Yp>! zaY0Y7hHE8vQ+*9{*u?g9M{jBbi7`XU6z&-AR>$({KH4;gKeiDFhEfwXxJqihWL#7i z0f+<78(0Ph>c0el1S-2uEwz$)nD7) zPTrT7_!l~)OusNGiQHfsGJE5Ng}RUvom)b*_V?!sy^^>|4~emf>&YzC=jU-vV_LEU z;wxAcVi2w93~qfJvh$;Jb9856_4;W?Zc`yQVM~I+8_Ir#_KL>pmaLB-Pxe zGd(Kv!gR8A@hI`Wwhom`tAtolJ!23$L~KB^1T08c0IuZ|jWS(3E7Q7+C)30F)HXLm zB&MVJ%r?GNszRa*dQPZo=*{YL^1vYZk*(x)sXoINDxNq0x!}o!$GTh`U-IKo7SJoi zgv5fx3{~q5b!~3Z#`j5ytN5}wrtSu`*DEmy2$?~WJkAVdMknHh>I$vkCZwiR#yPm6 zd==77e`@BzqSK?S=$)O_2L*Q+YR!Kw3tYbtp)7I>hyqp}yhN24WOn zp)HK~l?^I%3nOpIXv5EQ>}iB)PDJdu(x4mWF_Q>r>kW0{C8*fv@1}es`zjJ}+B!Cj zNP5&NlNO%Rna=yTD`R+zlzAfdRyFe^EA!e8I@a~M+rgXFEM+G`hJNf%!yo z5fE%Gtf%m_{AiMdntAmyomWv_NUa0qq8A=_^7Y9=M$*WdvA#^!Z5gRn{ftK)NkZLp zOdd)m>TN0nFc++hYJJyk^6F&2PQP&qYit`harsRK`8;Qu?|Vuh7iaQO938gm{*4I7 zg)f`T=&BDJa3b{robQNj9Xc;2-zDxIp6Hfwf{nU;A5W^9!PTiz;wM3|po{Y6Z13pM z)_I~>PaeW%NuP>D1wevQQ@dVW$tOvoFy=l!?WqzLw{LHCu~5~kVHEp?&>_~G% zLxb8I>057Z!fwFm=xD%)s$eCFTv{?CxBAG@&W0OnmS~>UIw^TRF?xxJE*m0QCXY?! zWdiEVwiE5TbUEObP^y7owaNZsbF1IaV&;w`QbF=O+4AaVnbh_t){MnHja`CP^ z-V`OmG`eI*)8qEmT5=xtE*e^81eG<1lB~~5hf$e-cTSU5!Z82J?l&KJ;-Pj>Bah%*UEfRCk zUlSkD)plA@2zUNYQ(315j^b$x|I~P<3pv=8Bq^Vr2+QzzvA(hjpN+BQm%61pxrdDrJ2sepH>`rF;GW`=F zJ79K|VB0^mg2bV^~&Rt_} zs@Dlp69Tu0_LIaMcS=l1lnn>TPEc4E&_idQ{RQGdB4Xshv{Z)~={|q=Xqqpmiv{Y= z4`nS>FN}sz9VY$(+)P4d_clzqdk9|T>&Sjp_**wdCF$3YDKxt1=ZyzjFkQHNxm_GREeLBdZ})C)mJGM8zh773ZgtjOpB0hF z{!wQ(@k}*#Ql;g-d9qbxgmsi~H|n^^^oIG_f6TczD+!yAX&pq|jW{VvlXWy-&F+(I z28o4PEl$-|A=?bU5~g#8n_Ap9l8=RO?{w~FNW1(+s<~eKn!4F!l}>`cd(V+MBsh_GtR%#67&OeKD^mZVqb4$5 zDC!Jux$l=BvgP8E8Rtx_091ueAyO)7t}AoSteZU@?i=R1)1qSOX7xlOPAQ)}$LLOuN!_Nln@>ZemL5&Q?!bId2X;%oVAc?vJ`Bos zfMjkVNX46eL{_J9v+W!^h|(|oyLFRBq+mM*w__ID4im0Sn{F!y8j{l{j6Z6rqf_q% zAsu2ReFNvrVXH#T-qDAS@FF=w+)$^}YO=D4!=N|mkfNwD5x(c1Yrxt&!?7FVo%xqD zMVo(VOc1Wz-V**iHk|G2%dFH;H`3Rh9m@2QevoI73(m7%B&z{Bx7For$tuMyG+eas z(w7<61tpbv_rOqg3*O@o&vT@GPD`2qcp38z|S!Q>` zxF$D#&m`Wz(fLs~q7z5p~evdF^)t2z>7UtraV?(;TW@m@k zVTC+AC!A}z^KO@|CC9-!yk;HFx!uBSJ&SKYyT%D>GBxV1f|z}4I>jPM^S^`*=aOfm>>)$V2&%rHH`M(9Xi?Ul896AOlUc5BZ*dmj6Rs_p0nNG8l(ywkatOzuZKJum-ZVHm3^_$8juXu(7dxI7`xWz|Dr_d%eRsHEGqjs#{})99o5xS2jU4 zt2R79)SMkKD?i;G>F(Ec9i+uuYU-x*Pk`8X7W;O~d2vGYCmTeVyR355@llHGD5@Bp zgZT5(Icn1+w6|Z6t03>4sjtKWgj$!$v8-0{`;$)Q|6u4Ypb@9Nl2uq{vF|b-tYVn? zz}bQJl^>x?3jnO)3yM)Q_L%X{J!nw%7hfz+Yvw0f@v2wpxhHv{!!$lyu zrx7w(=a`)v9f`7*7)Xz>b9j{1W(~5JeMsSB-U*%)w&X3sjW_J!R0|g8H-M=z?`(6< z^1=--r`4Vi*+*7^)z=9%ZiZy$5Zy5Sy2Ww(warv-Pp5AU=MgTQ>&2f&e#RW46c(CdAFR-#&f31nNhUU^*K~qni-?d(dx9)I5D0KG()Cfn}Xl-FkI&I~i zpI8$6(UQUh)K8@I?p4fL1^OzSybZ{4wJJwU)A1H=sL51Nn6q3;Y!U}V?cA$lXxWLB zy+iI;W#kavUr;iaW*|0%LS$87SA=CZhd^#TaR8S9t5W>($CY6{^LAT8j;K=t*W6Ow zTm1&G%(X7hZqIT!t#P~Hgr@UKclThXYD-2Bog|2BYF+O#iIl%W#1uD&$wu}IL|Wmf z$ZJA|l7u?WuGI=;uWM5(FMB>NMwt5_z7JVpCfO}=LHC2T6MjAAc_#b)zuAngyfAHz z3GHKSHji-J3k7bMw=uJY6&Tn0*q+e!cDKI(rew)%;)cOyFkjtPkR7skznp4}el&A; zTNiF!!bYV=E@1(oiAOhfxa~{3nHdeFG8{MO-R8*rP}eZ-HU@*6ut8JPk{RZXQC=c% zatkdZj;8mm!t^I`f7G3zi85d@*qxEDPj>wJ!Le_zcQip7aYDXHX>T z@o{XhJ#1WKaGTUI)!i(sB?ooj5 z4G>*PY@OAj-sVD*K+1hWH|>SFTbI(VuEbA!y+fiE?HPrukF}D-A=&vena)lc9OvBP ziL(y&QMSolFtIwd!{FcaHRrBLTtPE$H)*S}is3Xi*ULth#vdUowttrg>;JoTYmy8r z<$hMzt$HC8*rue7~@-?`-?#JJ^~X4!E#()-os#3%N*M&i^qkH+K#bYo})k{D7!ap zW1~6lYai8*`q(!waKV(uvVH9mq-2j(R>Z18*%9%(NABu1dKMkV`&U9d;&rY#CuM53 zyO1pt9X+b95c}vj_>AFHmuwN zRo33-&||eb8j{t7TgK_~O{c7Q4aGounN4@g0b)el}92W<3CkK8Hngv+mKmMwg3P(9~mHc6+*_f3JbiIQ%S#oo& zpUeGxy`Gz;WFpXoHxtT~WeJon*6InSvZ)JtcPU5@1QQnIwwtp+o$k72=Yph{o4y;p zn|AxtgYMxi-MwRZQU<*rS8&Sda2GUXYc+^lhMlv0?x=A)=G%G;c`p5Lk<40JxXTYA z(upsV;y_WntE;sf+dhK`kyc|>koL+IVgQ)yHn|S$Xp7~Zu)E4>4BL7~_D}n;PsJ=K z<{$RL0M$HILNX2dWFrJ@wk=XhW{8b`*07uC^K(Dlq)?;P{DC~SJu{vj@)6E)j~UO~ zdX6__L{MTi^8SdJERot?Bya0z^XpgMt%&z66^dOzDfXe1_H#BZbz4C$-c=Fpw&@m< zs+T<_-apbkMdCPjN#ziNV_wK^;YJ}#J}(*tuJ~=+MOJ_w9DN)VF8u+ z3_&J8x5DrNLWo$rCyMpK%HVi`rR39I*QRFXMnX3mn9TIT~zeD_>MVQA)<_lzE=~&<< z33Bte)4)4-=fZ}3=t&q4w~U=7&a+ujtz5_u0qZEDI>$Z~$63CtiY5C|f@P+(+kn!g zYTCtFu`)S}oO7wwJCx`weqjPRNjjd%4asX7a*sxqM$RY*_quWqow)cJB4uhumm0H%l+;e{+5Z-9iGHk@`ubwtb#>0ceU)z)U&R))bUU(PZRJkKTrS{m zpt^fe^FyNJ*sshqd(ty*M%KGc?jB7)Z?OLVet{KF@|VEnlD-=!*M*@;8tJR?Uc@CRQLv94Q3!?9$AQO9YM*<747LCb7!v+R|mpw)u zfKGMMz<=FYo@^Iu7$6tin(Cd<1+kd&t?9AcTpRW|cSrrTVM(V^zX6wE1>C3SZW>3; z!eP#Jh9-G+BTgiiOX??U1@=(QZBFt#xh^PvrxcTS#}P9Gi2^|)IVjOFjXP7F)5hjL z+$l+$K!Tgc_fDM@oeIP?gMA1|AH^Yvt9iP$vix)ho*)l#tsp>868#j_S&ZlO)^!vv`1Y(+%$3BNo!-g7-?*` zO177ZR#E=tqK!GR^i#KFvKn68+OCBQjqdF`Zf3-9UMnXuPaBgZ&?2kGTzqjg$!Pqk zxVQpalWfou9LR5wfEnMpk8}Pc4lQPykrNxg?iPDx z=S}v!W#`}CRFm6izGrs{v|ipR(Fn&49BB`G$=0ka?qI1pS`_^aG>0~zj+sg zjfw*EvdvcGIID@#QJ2eZ1ty~)-Wq;KLpqR^QH>a)97mZgD;Le7oMpCQMY0vSFpbSB zJEE~*MS3k-(>XishDC|DNf&*?Y8IjO<}>bxCZvMQxTyi1CeXgV7%jU>Zr$il$=qcM zqLAN0n|mJy_BOP$ogPTormv5uvV{Wgkn4NcF8<6()18wE0doVZB>9>d#t~N2{&!@? z5a@~VzCY(M*Soz7=E#4}-)3TiR@9`$TOaLo2_Ku~?>g@)INIvXHpfKU7 zGaG9&8X)U&zvtjz3YK|AqL1>6p*SU@L;I5jqHVbhGB+6y=bW@BrzcP&MqO2-n=CJK zrH6+25f6DU+b0}4`k-7<9&uX>Vt6=%Sdiv5s_$&CL=BZXY4nP!qrIk)iIs`bcXOMy zTkf66)I`=+&@BPAI&Wdx**lK)q)?ZX8cJJJy&-cR;k2RYNJXuD|GXH2l zz7P_SqaD-+6XZtruH9fc9U2`pFBDA$8ES=7b>wY6VgsnZjL zxr;QMJ(=B|1bGuUK7b9uHcxEnwy}239LIL0?4`0{=|(Jsw?F5tMPfry)nxS2ar0JD zw&n;>jEm*A$d5$Wgcp|l8J-%Lxd;)+8!+Jm*T!o!R*C}b%!eQPJ;(6sYkZs%UXEnR zhRMV?_#MR?>eTAgkKO5xUJAii+eUQ4qsjb9)3r>th9qjb+xl{A!d>y*faU81ZSPVG zNphs&>;~Dm!^Y%w1>FyE?{Pbjo4-kp=Eik5I=Nn#k@xJ~#Hb~How=^#`i{n^?HV zF-KhNeGaiOC=l(#8vJNh9f)TNmF2TIrhWe}xy2;rpE_C z_jX0kuBLjSq#APU5e~WIv|~=zn!JjnA?dee<2XewE${Q;5+Z2b#uqL5UxEoyUk%iW zSE8-vc>b+Y(YId@ZQw`75T~kIxN*k>vavLvSuvIq-VEWzNdLMB5+h!O{cXRctk33N zT2(%LHM2`40G8Ix9S%Xom0h&8L2odzwX74?2rw&^QI)rBNtrc zuAh$PCaU;KG&ZASQvj8V-Hn6W7OO1@;i=s8gWOasp zxSs(KWv}aK;7+Ddcp?&afn5xlEns33z4Llt@`G5?T)6O-t48LARXW_Jz3d;mGjDz; z#oap$+h=prBFVFY6RLl>wXOadfO9%tCt#5@;r4+BxZa3GW{_-mN`9`Sn>%A+8h2F8 z@!&WeuF>@^qlVAFi9_QVwQftG8 z!krwBBCVQyA2pm&%cZ4MUkI;UC5V4`$xWGV2{0;Yw{EVP2~5uW;&-Iv{W@h>ruFt# zcaUSOSPj8Pe$?%b+&2`q=yP|vt48ZDnIliRP$TPjcAEU95qD8qH}Q-M3WYS)q(gr` z!Hw++ugezP{3(K6`2hr7 z@5&^jvQEo+kuyaERWEFdg^Sc6(7nPh7DY+kuBo13pE`5ScoR3~ zZCf3fyhQ@Mu6tdC*Pt+WUoXx{rF|TLRe}1J@SJX?NAh|9OO$5EN34+@RXN;^Oli_{mL{F}IrYXt!bI^dbuky0;f9h4rvTR3mkfx2C^8gGBkM zjPOGdb))$q{b^bEa&_|KkrIICY_d3I$hx2HFZT-D+>K?ozY-s)qEeNySW=$*At){W zJsOuI1j##x)rerX=(Lh7|3$#gDkUKKp`KIdKfX%{oUNN`a;*NhfOB;WrL7 zES59 z#3`fugAcd8r@W#|SyT|#uv2|eU-Af^vb{F{AYKAuxIo4$&i=R52<#YghBe!8Zge8t zrSwDk6w=c+1BP+88| zZ7JPu%O)EnlAz30JX$b!?rJCG;>*@3E!QvzrcznuD*h3UA)TNl+{uA29W)o#$-ecF zvg*!P)QuX3a_kNF1t*fEj-O=qyQ$oT;g?0YE`h!1{6X65H|6xgjAN;lU)v<4x`Ze> z`B}PlskSH~Odr3o6?8qStrxDcY;!u8b3`?%jUr7x2m&63)z0u@X?Su`{ zfuFNjXpA!FB)3i9@goJXcMix*#xDHa{S&W$c?rmI(VFSab6npGGvbiR+yZhmf8nui z4s>Sij)6-vd_EIr88C^1uNxgS^QQ3WR<&*ksP4s80xF8SH0ja1ErfJ?0Y1mp`v$`6P<3En%zXXq0WVEH$5>e=HuB3 zan4-`DdBo-k6y#Ojv;1V1pZbNX%t=x;ul}sly;$1R?yp!&x7g zd~_G#$Q==?NNtySu=mIh6}jINcKIvx_{AbKZATlmnUlvS=tO>ZSV(Kj{Kh;gXES8Mh{~Vi4gi4q+lr zY8j5;B6nz$sY>MF@=&h?$vjX}d_~v0EXE3(EmFLC&HhvR_c}3n|MX4bnfj(Jo#lO;; z%vth+hO?MBe(RaL8pymWrcOl2K;Inaci?naE}WILq(=t0o~luXWv+&-$%%VE3+YE7*CZ>VJ@K0Usa{+@_*32-nI)-)01Ed}uH}qzc zb%X{h7Dvt*#UuR1h#;<5JS*g<&0HjMKSiuTkBhqIY)+_KhTlF#_Ysq#e&jvV|uk z>F@4xV>0ZLsK^3>FUYHC{_xcOXq&2-mJ;sC5W~;H$_Y-te5-?rN`r}}2w_IiWfTqa zaH_VY!{{9R&R-UF-e%`5lDN4)DIfM3sOqn6Ct)T0lz04N!|_!ac5vogKh~c^XfDJz z$DDb&BRjVc()cIK5#FfKU>=0*{rMQ6T@4wL+j)`AVf&J=rZ>rWa%Yu)3~>= z<2@z`PeIo6H*mzPQNcT|5TN{R@}i5r?W}&ILC(K>E;calLRrJQjp807TQm8rMvaZB zd`5qxOxSRdE>0K15}}VRbv}6DvpBPxBKscmm&1^SCvNUC&1d3Hug>cn953k+ zA}y19seTf;Vfpe58tcAQe~)_Qa@}JZl0+fz?kuaMaaH#W2RD5x$bHKod4E%Ni z^J%f78-4wvim0?Mz-LCKB>`UHdEuL7MSL4B@L06gKkw%GHJ&f21HXZc8gUKLh@*uP@KP=V5vNmf__mUKi+~xGZ^Ie4?jKo>xRgAM>;o_nA85 zQSmpz^E;!GOT0{q9{{GE{1rbL6@4o_e;znI|AeXkX;c4DR5}*=JQ5XE2lzKhKPAOU zKP4-Yeo9s+{gezwC4b@DmOK*G^j^?fcV_H{Np8`nAlmnE`VAhsd$l;CFK1;H-_o{oxw9v8eF75#_rXJJ`XTovFz&rlRC4D<*b z=n**RLg0&{1=-MceKPLCjh-IHT`0QnJTC0_&!KbSXjIY?+6MVcpRf5kz{fliMSZ@` zF)v5OuY0&G&_n-aK|TWWeZ)||Y%(fJ`TFIHqoOcY`Rb_j!$J>#<&D7JhRd6x(i=j3 z+CCZJ9SM)+#Fik#^4~-YUibZ+#D68u7oEx1Gm)Xd#go9uP-4Eqr%~UJb3912#P8GZ@%06M-akifr-yL`{-S@r6Zp%%KJXde^Uq%a78;OYG4Ppr|D3jGZuidx zemmjuy{9F0-g{P32QZeyS=eWg$=MYK&KcOq@AJYhCH-7@IDsz;df6XE7X`ft zyf3M9ab?2S#j6uNUVK%e$BTdEpYMpGi+|&v121b&Xjt}2(&w_-1pZ)4;_n~4&ph8_ z;5QSvsy?Bointeizv||Mo~j+DzTsv0s^t0dElK_5!GE#a73fy`M8+$SpW3;=(!c0^ z7jS3`yz+)5ZmhgHi4QA3k;JQ&pG;!WsuPpvt4=o0mqexOy}mB#i;7DuHncKQiO~G8y-BuZxoMD7t*DZ!7RR-#=qrzTQ6NH;m zdagRdKc56X%fXWCTvcn}#-z@NRz*e6dL30GyP&UXp=}|yaez-eFZ1;Uo{5T|5B1-O zN-hg9xqYznn$o1tn$1zkX}(SkF))VrL<`;w&-Y>Oz^kyU8sciG1Ie);)z&Bd*Rt*l zW7UotcuzuG?dwr-$WLkyC1cesPWrE_PR6Yx)&-xfqyMu!ZFS@W@$;R@Saq{WpY^1R zftUIU16L*W>(`j)^dHw}Efe~$-)-veGtb{h>Nk`oJT|l>^f!FM`%z^SHGJCpk-)!l zdK7@`rd!-|vH7O$zK%Tqc;Y)v@E+n% z(^r$&()5iawlse{iTTZ+NMe5Tmy_7u{M973H-E#_|CXu$6X=EJQtY?+XO4D(uUit8 ze9qg?b>u$*UcWPu+xoqU+&ZsFo_D^Qz?-TP|Jt8Fc&uX=iJ=tvY*`h0l) zasqds85MosKku$ea^uw2M7F8ziEL9-QR$h!e(JGAFDcg1VO@~gnbaBRLjKI3Q7(!G zHXHa22baM2z(Efa#|GYXaA|cE4IM#*(w4uWUq>Z>C_j|Yp_;m-LvIF>lgHL0e5#%ZKEFJIEzR1I`0#|u>KkzCC zpCQlJIQaBKz*qP>Zva>O=ZAso{qr}0n>;)V+~VQ4fZIJR{d79`bYzq5^3SE8%^rRm zxX0Hy0Nm%F{~CDE!KX&RLmn;#&Uv^Dc+|s-fX5wt`YXV<`{#>+Cp}yNe4m5g^CjRZ z|GX0T5f3i`-r?b;z&kyB5%4Y#R{`(#@G9VG53d1!*~3==@9}Uo@TWXn54_jGr;h@^ z;$i7?pM%dB1cpA*;~7K1Gak+Xzv}DDxcfaUeZKDCQ~Q7qcv$**!`G4i5BlfQ&zlae zI08KDVQ9&|<=}U}4SdMM(31VBgHOE=_^^L|5is?HPWBI?EPV-l8g;Y3_Rn`}h;wyz z0hhYxiz$BzIwk%T9Rmz)3RC_P>#u+DaqOkpsOU2RX3ukXfLT{=4DgX?!D}9lnBPta z@FMm{fJ-ip032NW9$*YgpMMYdbjGJnX$A26*fR=kKj`WdoyYUlzU_0sSNgWQfomOH ziVUJ=55rT`?%{6$Z}RnLfXNwT+yy*~IA;*J^i5y_gwpdQ@Es18{i5g|Uq|SC%)tw$ zfS-48^bqhTJiHnB6$cl;1pLPiE`1jGYYr}Y6`1j4tl}Gi(XZ0*Uf^FiIQjwdDE9Tg z09@(e*MQNtwq>1BbcKKZKH$LncYr&5oxca>JV5G4Uj`m>@Pcmx-|yhkTY%wN>Xe}W zqK`Vb2>BI#)7PPHk*B!`ITiibJ&*nk_?I50ZE=Zj`*YxO2bUnfVt7*?F9p89*N2y4 zaCt8048`@n{s=IFW|hO`1c%K@`u2m^UvY8 z_^S>sdKTF86~TA0=Zm4D5_~}Wf%cNc4wn8(-shhefG_d=Ku<}(gQE?=lu6s-e+Pcl zKW_mJcJg^(Pg?|!CEiX-_5gpy)nD+>z}TzyGk{%s8(8og;CJ~tj{~3Y;L_WHS39_9 zGjN@M{%+u4{|^D*6uZ>tPXm9;!{-9eI=E;h@Xs7v+6eq> z2N%=-g5!MszXryKrJv|>;PV_@^aJ2kzRn8ZT3?6q1%b{y@Xh{tHL$nUQe?8g>pB_* z_PQ2ZTkwqUpYayF?BL>m0{*OjF7(VexMTwO?;ITc3YdPC-(LX#(!3)sh&1w1>(^HuUUz}NWtUjshm;3DL646;++v9~fWH;FA}UT&p3 zfP>spz-xV5crU|$wC&e{H#)c&KFW}nK3@pzd0Bvu9_wi<o)3mwbJAKlYox{vQAz z_Aqii4mrwLrN0C0X)9R=>}iXT_i-Jr&I0H>uE)VeyMaBO(X+s}`+jPG?{=`ZeGI#x z|EPuMPnmwE{quI7|E}rtv;KJ}&+&Psjrr&}nFEAQ{OGv9^8FkSOzb{U`Y#23)5D<0 z{nW$6o8#bD>kt!Y;$V0@o;La%*&cta?;jZ-PdyzMJsy9Nf4&(w_zRsJk9@Rk0hsm* zXMx*1FMkYtgMW^$jwe27ot?nF2`|Tw`}+L%_pX4@+L{{=wp42JAPeKk;e4&R&qh*DO;nCC<{yUm? z{~ZiaK0TCLra!8-Ou<5*ywKoa1M+EWeZGYs7+luRi-GcHVlQ`<w(lI;NdUyy@Cg}ze(^J z{t0~x_$OsTUoHQnzhd?VrlKPLMGNi+4}YP*D|ul0d#V}~-_rh$@nzB* zMTHZ58UN8g=|le7CUs1abD@%Ym7F8sL-8N>t$(S>xZbYmsEB{jf*vh#{}<}zCtW@G zAlwx3FX(1&z575tzb{o&uNwRjS4ICn(1)ML^)@h~@E7Vm&I5s~wV?RfA^uy% zKan%BH|D-?RRmKuIe~y3BpZhC%>DR;x z=D+wal<$;( literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c8d81f --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Example plugin + +This is just a simple example plugin which can be used as a template. + +## Building + +For building you need: +- [wups](https://github.com/Maschell/WiiUPluginSystem) +- [wut](https://github.com/decaf-emu/wut) +- [libutils](https://github.com/Maschell/libutils/tree/wut) for common functions (WUT version). + +Install them (in this order) according to their README's. Don't forget the dependencies of the libs itself. \ No newline at end of file diff --git a/makefile.mk b/makefile.mk new file mode 100644 index 0000000..e711172 --- /dev/null +++ b/makefile.mk @@ -0,0 +1,64 @@ +# Compiling the projects with libutils logging code? +DO_LOGGING := 1 + +# Links against the wut implementation of newlib, this is useful for using any function +# from the C standard library +WUT_ENABLE_NEWLIB := 0 + +# Links against the wut implementation of stdcpp, this is useful for using any function +# from the C++ standard library. This will enable WUT_ENABLE_NEWLIB if you have not already done so. +WUT_ENABLE_CPP := 0 + +# By default newlib will allocate 90% of the default heap for use with sbrk & malloc, +# if this is unacceptable to you then you should use this as it replaces the newlib +# malloc functions which ones which redirect to the CafeOS default heap functions +# such as MEMAllocFromDefaultHeap. +WUT_DEFAULT_MALLOC := 1 + +# Target filename +TARGET := $(notdir $(CURDIR)).mod + +# Source directories +SOURCES := src + +# Data directories +DATA := + +# Include directories +INCLUDES := src + +#--------------------------------------------------------------------------------- +# options for code generation and linking +#--------------------------------------------------------------------------------- +# Extra C AND C++ compiler flags +COMMON_CFLAGS := +# Extra C compiler flags +CFLAGS := +# Extra C++ compiler flags +CXXFLAGS := +# Extra linking flags for all linking steps +LDFLAGS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(WUPSDIR) $(WUT_ROOT) $(PORTLIBS) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lwups -lutilswut -lcoreinit -lnsysnet -lgx2 -lgfd + +#--------------------------------------------------------------------------------- +# Will be added to the final lib paths +# example: +# -L$C:/library1/lib +#--------------------------------------------------------------------------------- +EXTERNAL_LIBPATHS := + +#--------------------------------------------------------------------------------- +# Will be added to the final include paths +# -IC:/library1/include +#--------------------------------------------------------------------------------- +EXTERNAL_INCLUDE := -I$(WUT_ROOT)/include/libutilswut diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..415d6dc --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,86 @@ +/* Copyright 2019 Ash Logan "quarktheawesome" + Copyright 2019 Maschell + + Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include +#include +#include +#include +#include +#include +#include + +/** + Mandatory plugin information. + If not set correctly, the loader will refuse to use the plugin. +**/ +WUPS_PLUGIN_NAME("MiiversePlugin"); +WUPS_PLUGIN_DESCRIPTION("AAAAAA"); +WUPS_PLUGIN_VERSION("v1.0"); +WUPS_PLUGIN_AUTHOR("quarktheawesome"); +WUPS_PLUGIN_LICENSE("ISC"); + +WUPS_ALLOW_KERNEL(); + +char original_url[] = "discovery.olv.nintendo.net/v1/endpoint"; +char new_url[] = "heyquark.com/miiverse.xml\0\0\0\0"; +_Static_assert(sizeof(original_url) > sizeof(new_url), + "new_url too long! Must be less than 38chars."); + +// We'll keep a handle to nn_olv, just to ensure it doesn't get unloaded +static OSDynLoad_Module olv_handle; + +ON_APPLICATION_START(args){ + socket_lib_init(); + log_init(); + + if (!args.kernel_access) { + DEBUG_FUNCTION_LINE("MiiversePlugin: No kernel access!\n"); + return; + } + + OSDynLoad_Acquire("nn_olv", &olv_handle); + + //wish there was a better way than "blow through MEM2" + //TODO use OSGetMemBounds or w/e + for (uint32_t addr = 0x10000000; addr < 0x20000000; addr += 4) { + int ret = memcmp(original_url, (void*)addr, sizeof(original_url)); + if (ret == 0) { + DEBUG_FUNCTION_LINE("Found string at %08X\n", addr); + DEBUG_FUNCTION_LINE("string: %s\n", (char*)addr); + for (uint j = 0; j < sizeof(new_url); j += 4) { + uint32_t val = *(uint32_t*)(new_url + j); + WUPS_KernelWrite((void*)(addr + j), val); + } + DEBUG_FUNCTION_LINE("string: %s\n", (char*)addr); + return; + } + } +} + +ON_APPLICATION_ENDING(){ + DEBUG_FUNCTION_LINE("MiiversePlugin: shutting down...\n"); + OSDynLoad_Release(olv_handle); +} + +DECL_FUNCTION(NSSLContextHandle, NSSLCreateContext, int32_t unk) { + NSSLContextHandle context = real_NSSLCreateContext(unk); + + //Add all commercial certs + for (int cert = NSSL_SERVER_CERT_GROUP_COMMERCIAL_FIRST; + cert <= NSSL_SERVER_CERT_GROUP_COMMERCIAL_LAST; cert++) { + NSSLAddServerPKI(context, (NSSLServerCertId)cert); + } + for (int cert = NSSL_SERVER_CERT_GROUP_COMMERCIAL_4096_FIRST; + cert <= NSSL_SERVER_CERT_GROUP_COMMERCIAL_4096_LAST; cert++) { + NSSLAddServerPKI(context, (NSSLServerCertId)cert); + } + + return context; +} + +WUPS_MUST_REPLACE(NSSLCreateContext, WUPS_LOADER_LIBRARY_NSYSNET, NSSLCreateContext);